Pandas Latitude-Longitude zum Abstand zwischen aufeinanderfolgenden Zeilen [duplizieren]
Diese Frage hat hier bereits eine Antwort:
Schnelle Haversine-Approximation (Python / Pandas) 5 AntwortenIn einem Pandas DataFrame in Python 2.7 ist Folgendes enthalten:
Ser_Numb LAT LONG
1 74.166061 30.512811
2 72.249672 33.427724
3 67.499828 37.937264
4 84.253715 69.328767
5 72.104828 33.823462
6 63.989462 51.918173
7 80.209112 33.530778
8 68.954132 35.981256
9 83.378214 40.619652
10 68.778571 6.607066
Ich möchte den Abstand zwischen aufeinanderfolgenden Zeilen im Datenrahmen berechnen. Die Ausgabe sollte ungefähr so aussehen:
Ser_Numb LAT LONG Distance
1 74.166061 30.512811 0
2 72.249672 33.427724 d_between_Ser_Numb2 and Ser_Numb1
3 67.499828 37.937264 d_between_Ser_Numb3 and Ser_Numb2
4 84.253715 69.328767 d_between_Ser_Numb4 and Ser_Numb3
5 72.104828 33.823462 d_between_Ser_Numb5 and Ser_Numb4
6 63.989462 51.918173 d_between_Ser_Numb6 and Ser_Numb5
7 80.209112 33.530778 .
8 68.954132 35.981256 .
9 83.378214 40.619652 .
10 68.778571 6.607066 .
Versuc
Dieser Beitra sieht etwas ähnlich aus, berechnet aber den Abstand zwischen festen Punkten. Ich brauche den Abstand zwischen aufeinanderfolgenden Punkten.
Ich habe versucht, dies wie folgt anzupassen:
df['LAT_rad'], df['LON_rad'] = np.radians(df['LAT']), np.radians(df['LONG'])
df['dLON'] = df['LON_rad'] - np.radians(df['LON_rad'].shift(1))
df['dLAT'] = df['LAT_rad'] - np.radians(df['LAT_rad'].shift(1))
df['distance'] = 6367 * 2 * np.arcsin(np.sqrt(np.sin(df['dLAT']/2)**2 + math.cos(df['LAT_rad'].astype(float).shift(-1)) * np.cos(df['LAT_rad']) * np.sin(df['dLON']/2)**2))
Ich erhalte jedoch den folgenden Fehler:
Traceback (most recent call last):
File "C:\Python27\test.py", line 115, in <module>
df['distance'] = 6367 * 2 * np.arcsin(np.sqrt(np.sin(df['dLAT']/2)**2 + math.cos(df['LAT_rad'].astype(float).shift(-1)) * np.cos(df['LAT_rad']) * np.sin(df['dLON']/2)**2))
File "C:\Python27\lib\site-packages\pandas\core\series.py", line 78, in wrapper
"{0}".format(str(converter)))
TypeError: cannot convert the series to <type 'float'>
[Finished in 2.3s with exit code 1]
Dieser Fehler wurde durch den Kommentar von MaxU behoben. Mit dem Fix ergibt die Ausgabe dieser Berechnung keinen Sinn - die Entfernung beträgt fast 8000 km:
Ser_Numb LAT LONG LAT_rad LON_rad dLON dLAT distance
0 1 74.166061 30.512811 1.294442 0.532549 NaN NaN NaN
1 2 72.249672 33.427724 1.260995 0.583424 0.574129 1.238402 8010.487211
2 3 67.499828 37.937264 1.178094 0.662130 0.651947 1.156086 7415.364469
3 4 84.253715 69.328767 1.470505 1.210015 1.198459 1.449943 9357.184623
4 5 72.104828 33.823462 1.258467 0.590331 0.569212 1.232802 7992.087820
5 6 63.989462 51.918173 1.116827 0.906143 0.895840 1.094862 7169.812123
6 7 80.209112 33.530778 1.399913 0.585222 0.569407 1.380421 8851.558260
7 8 68.954132 35.981256 1.203477 0.627991 0.617777 1.179044 7559.609520
8 9 83.378214 40.619652 1.455224 0.708947 0.697986 1.434220 9194.371978
9 10 68.778571 6.607066 1.200413 0.115315 0.102942 1.175014 NaN
Gemäß
DiesOnline-Rechne: Wenn ich Latitude1 = 74.166061, Longitude1 = 30.512811, Latitude2 = 72.249672, Longitude2 = 33.427724 verwende, erhalte ich 233 kmhaversine Funktion gefundenHie wie:print haversine(30.512811, 74.166061, 33.427724, 72.249672)
dann bekomme ich 232,55 kmDie Antwort sollte 233 km sein, aber meine Annäherung gibt ~ 8000 km. Ich glaube, es stimmt etwas nicht, wenn ich versuche, zwischen aufeinanderfolgenden Zeilen zu wechseln.
Frage Gibt es eine Möglichkeit dies in Pandas zu tun? Oder muss ich den Datenrahmen zeilenweise durchlaufen?
Zusätzliche Information
Um den obigen DF zu erstellen, wählen Sie ihn aus und kopieren Sie ihn in die Zwischenablage. Dann
import pandas as pd
df = pd.read_clipboard()
print df