我试图从4个列中存储的4种类型的地理位置计算公里数。它是 start_point_latitude
, start_point_longitude
, end_point_latitude
和 end_point_longitude
. 在此之前,我已经做了一个数据集的副本,以存储所有的变化与新的数据在新的数据框架。在我需要计算的距离旁边,我有一个时间,在这段时间内,这个距离被覆盖。不幸的是,我得到一个错误信息。试着把数据类型从float改成字符串,然后再改回来。错误信息依然如故。
当我进行更改时,我得到的另一个错误是pairwise()。我可能是写错了代码。我应该在代码中的哪些地方进行修改才能使其正常工作?
你错误地表达了 X
和 Y
. 在你的代码中,它们是一个字符串列表,因此出现了错误。但你需要使用前一个单元格中的经纬度,所以你需要将你的 X
和 Y
是这样的。
X = [trips1.start_station_latitude, trips1.end_station_latitude]
Y = [trips1.start_station_longitude, trips1.end_station_longitude]
这是关于下面评论中提到的错误。你需要用以下方法计算弧度 math.radians
两者 X
和 Y
像这样。
from math import radians
X_radians = [radians(_) for _ in X]
Y_radians = [radians(_) for _ in Y]
result = dist.pairwise([X_radians, Y_radians])
# multiply by Earth radius to get kilometers
result = result * 6371000/1000
所以,这里有一个工作的例子 并尝试把它作为一个参考。你可以从下面的例子中下载使用的数据。此处
import pandas as pd
from math import radians
from sklearn.neighbors import DistanceMetric
df = pd.read_csv("countries.tsv", sep='\t')
egypt = df[df["name"] == "Egypt"]
australia = df[df["name"] == "Australia"]
X = [float(egypt.latitude), float(australia.latitude)]
Y = [float(egypt.longitude), float(australia.longitude)]
X_radians = [radians(_) for _ in X]
Y_radians = [radians(_) for _ in Y]
dist = DistanceMetric.get_metric('haversine')
result = dist.pairwise([X_radians, Y_radians])
# multiply by Earth radius to get kilometers
result = result * 6371000/1000
print(result)
#[[ 0. 13232.2081954]
# [13232.2081954 0. ]]
也就是说,埃及和澳大利亚之间的距离是 13232.208
KM
我有建议怎么计算,结果成功了。 非常感谢大家的帮助! 下面是一段代码。
'from math import radians, cos, sin, asin, sqrtdef haversine(lat1, lon1, lat2, lon2): """ 计算地球上两点之间的大圆距离(以小数点为单位)""" # 将小数转换成弧度 lon1, lat1, lon2, lat2 = map(radians, [lat1, lon1, lat2, lon2]) # 哈弗正弦公式 dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat2)**2 + cos(lat1) * cos(lat2) * sin(dlon2)**2 c = 2 * asin(sqrt(a)) km = 6367 * c return km
for index, row in trips_1.iterrows(): trips_1.loc[index, 'distance'] = haversine(row['start_station_longitude'], row['start_station_latitude'], row['end_station_longitude'], row['end_station_latitude'])'