需要高效的python代码(使用熊猫)的帮助,以找出哪辆车在什么时间经过的时间最接近identity_sw =(35.7158,-120.7640)。我在确定欧几里得距离以在df以下进行排序并打印哪个车辆及其对应的时间最接近identity_sw时遇到麻烦。所有时间均为HH:MM:SS.SS(假设以下时间为12小时)。
我的时间转换功能-
def time_convert(str_time):
values = str_time.split(':')
mins = 60*(float(values[0]) - 12) + float(values[1]) + 1.0/60 * float(values[2])
mins = round(mins, 4)
return mins
我的csv数据框-
vehicle time lat[D.DDD] lon[D.DDD]
veh_1 17:19.5 35.7167809 -120.7645652
veh_1 17:19.5 35.7167808 -120.7645652
veh_1 17:19.7 35.7167811 -120.7645648
veh_1 17:20.1 35.7167812 -120.7645652
veh_2 17:20.4 35.7167813 -120.7645647
veh_2 17:20.7 35.7167813 -120.7645646
veh_3 17:22.6 35.7167807 -120.7645651
veh_3 17:23.4 35.7167808 -120.7645652
veh_4 17:24.1 35.7167803 -120.7645653
veh_4 17:25.0 35.7167806 -120.7645658
veh_5 17:25.9 35.7167798 -120.7645659
veh_5 17:26.6 35.7167799 -120.7645658
因此,一开始,我建议您使用Geopy之类的库来进行计算点之间距离的繁重工作。其次,我建议使用GeoPandas存储地理信息。稍后再讨论。
假设您的距离函数称为distance
(您自己编写代码,或根据需要从Geopy获取它),这将在一定程度上帮助您加快速度。请注意,即使以下实现使用vectorize
库中的vectorize
,也仍然是循环。另外,以下是伪代码,您将必须对其进行修改才能使用。
numpy
推荐GeoPandas的原因很简单。如果您有大量要搜索的点,比如说每辆车每分钟或每秒钟都会留下一条点的踪迹,那么上述答案将需要很长时间才能计算出来。如果要将数据存储在GeoPandas中,则可以使用GeoPandas中的import numpy as np
def dist_calc(point, list_of_points):
dist = np.vectorize(lambda x: distance(point, x))
return dist(list_of_points)
# Now you can call it simply using:
df['points'] = list(zip(df['lat'], df['lon']))
df.groupby('vehicle')['points'].transform(dist_calc, point=incident_sw)
和buffer
工具来限制事件周围的搜索空间。在这种情况下,您将围绕事件构建合理的大小缓冲区,并且仅搜索落入该缓冲区内的那些车辆点。这将有助于加快您的代码。
我建议您花一天的时间来熟悉GeoPandas的所有功能,然后再继续。
buffer