Trying to get distance using longitude and latitude, but keep running to an error: 'Series' object has no attribute 'radians'
Trying to get distance using longitude and latitude, but keep running to an error: 'Series' object has no attribute 'radians'
我有一个包含经度、纬度和其他数据的 csv 文件。使用 pd.read_csv 读取数据,然后将经度和纬度放入数据框中。定义了一个新的 DF:longLat = gps[["Longitude", "Latitude"]]
试过 longLat = longLat.apply(pd.to_numeric, errors='raise'),但没有用
Error message: AttributeError: 'Series' object has no attribute 'radians'.
以下是我尝试过的方法:
data1 = pd.read_csv("xxx.csv",index_col = False)
# data1 = data1.apply(pd.to_numeric, errors='ignore')
timestamps = data1["time"]
latitude = data1["latitude"]
longitude = data1["longitude"]
travelstate = data1["travelstate"]
month = []
day = []
hour = []
weekday= []
timestamps.head()
data1.head()
for timestamp in timestamps:
month.append(datetime.utcfromtimestamp(float(timestamp)).strftime('%m'))
day.append(datetime.utcfromtimestamp(float(timestamp)).strftime('%d'))
hour.append(datetime.utcfromtimestamp(float(timestamp)).strftime('%H'))
weekday.append((pd.to_datetime(timestamp, unit = "s").weekday()))
gps = pd.DataFrame(columns = ["Month","Day","Hour","Weekday","Longitude","Latitude","Travel State"])
gps["Month"] = month
gps["Day"] = day
gps["Hour"] = hour
gps["Weekday"] =weekday
gps["Longitude"] = longitude
gps["Latitude"] = latitude
gps["Travel State"] = travelstate
longLat = gps[["Longitude", "Latitude"]]
def haversine(lat1, lon1, lat2, lon2, to_radians= True,
earth_radius=6371):
if to_radians:
lat1, lon1, lat2, lon2 = numpy.radians([lat1, lon1, lat2, lon2])
a = np.sin((lat2-lat1)/2.0)**2 + \
np.cos(lat1) * np.cos(lat2) * numpy.sin((lon2-lon1)/2.0)**2
return earth_radius * 2 * np.arcsin(np.sqrt(a))
a = haversine(longLat.Longitude.shift(), longLat.Latitude.shift(),
longLat.loc[1:,"Longitude"], longLat.loc[1:,"Latitude"])
print(a)
不应在以下情况下使用 longLat:
a = haversine(longLat.Longitude.shift(),longLat.Latitude.shift(),
longLat.loc[1:,"Longitude"], longLat.loc[1:"Latitude"])
使用时有效:
a = haversine_np(gps.Longitude.shift(), gps.Latitude.shift(),
gps.loc[1:, 'Longitude'], gps.loc[1:, 'Latitude'])
gps['p_latitude'] = gps['Latitude'].shift(1)
gps['p_longitude'] = gps['Longitude'].shift(1)
distanceI = gps[['p_latitude', 'p_longitude', 'Latitude','Longitude']].apply(lambda x: haversine(x[1], x[0], x[3], x[2]), axis=1)
这是一个很好的解决方案,除了你必须交换 haversine(x[1], x[0], x[3], x[2]), axis=1) 到 apply(lambda x: haversine( x[0], x[1], x[2], x[3]), 轴=1)
我有一个包含经度、纬度和其他数据的 csv 文件。使用 pd.read_csv 读取数据,然后将经度和纬度放入数据框中。定义了一个新的 DF:longLat = gps[["Longitude", "Latitude"]] 试过 longLat = longLat.apply(pd.to_numeric, errors='raise'),但没有用
Error message: AttributeError: 'Series' object has no attribute 'radians'.
以下是我尝试过的方法:
data1 = pd.read_csv("xxx.csv",index_col = False)
# data1 = data1.apply(pd.to_numeric, errors='ignore')
timestamps = data1["time"]
latitude = data1["latitude"]
longitude = data1["longitude"]
travelstate = data1["travelstate"]
month = []
day = []
hour = []
weekday= []
timestamps.head()
data1.head()
for timestamp in timestamps:
month.append(datetime.utcfromtimestamp(float(timestamp)).strftime('%m'))
day.append(datetime.utcfromtimestamp(float(timestamp)).strftime('%d'))
hour.append(datetime.utcfromtimestamp(float(timestamp)).strftime('%H'))
weekday.append((pd.to_datetime(timestamp, unit = "s").weekday()))
gps = pd.DataFrame(columns = ["Month","Day","Hour","Weekday","Longitude","Latitude","Travel State"])
gps["Month"] = month
gps["Day"] = day
gps["Hour"] = hour
gps["Weekday"] =weekday
gps["Longitude"] = longitude
gps["Latitude"] = latitude
gps["Travel State"] = travelstate
longLat = gps[["Longitude", "Latitude"]]
def haversine(lat1, lon1, lat2, lon2, to_radians= True,
earth_radius=6371):
if to_radians:
lat1, lon1, lat2, lon2 = numpy.radians([lat1, lon1, lat2, lon2])
a = np.sin((lat2-lat1)/2.0)**2 + \
np.cos(lat1) * np.cos(lat2) * numpy.sin((lon2-lon1)/2.0)**2
return earth_radius * 2 * np.arcsin(np.sqrt(a))
a = haversine(longLat.Longitude.shift(), longLat.Latitude.shift(),
longLat.loc[1:,"Longitude"], longLat.loc[1:,"Latitude"])
print(a)
不应在以下情况下使用 longLat:
a = haversine(longLat.Longitude.shift(),longLat.Latitude.shift(),
longLat.loc[1:,"Longitude"], longLat.loc[1:"Latitude"])
使用时有效:
a = haversine_np(gps.Longitude.shift(), gps.Latitude.shift(),
gps.loc[1:, 'Longitude'], gps.loc[1:, 'Latitude'])
gps['p_latitude'] = gps['Latitude'].shift(1)
gps['p_longitude'] = gps['Longitude'].shift(1)
distanceI = gps[['p_latitude', 'p_longitude', 'Latitude','Longitude']].apply(lambda x: haversine(x[1], x[0], x[3], x[2]), axis=1)
这是一个很好的解决方案,除了你必须交换 haversine(x[1], x[0], x[3], x[2]), axis=1) 到 apply(lambda x: haversine( x[0], x[1], x[2], x[3]), 轴=1)