如何在Python中将great_circle distance转换为timedelta?

时间:2017-04-12 09:33:36

标签: python pandas timedelta great-circle

我使用了great_circle函数来查找两个坐标之间的距离。例如,如果我有以下数据:

{ "_id" : ObjectId("58edf28c73fed29f4b741731"), "minItem" : { "item_id" : 3, "item_field" : 3 } }
{ "_id" : ObjectId("58edec3373fed29f4b741730"), "minItem" : { "item_id" : 3, "item_field" : 3 } }

为了找到距离我使用以下代码:

lat1= ['-77.85']
lon1= ['80.23']
lat2= [-22.4532']
lon2= ['62.45']

从远处找到时间,我们知道时间=距离/速度。 我假设速度为80公里/小时,我使用:

import pandas as pd
from geopy.distance import great_circle
from datetime import datetime,timedelta as dt
distance = df.apply(lambda x: great_circle((x['lat1'], x['lon1']),(x['lat2'], x['lon2'])), axis = 1)  # gives distance in km

获得的'时间'单位为'km'。我想将此功能转换为时间。

time= distance/80  

我收到以下错误:

df['time'] = pd.to_timedelta(time,unit='h')   

你能告诉我如何获得'时间'作为时间函数而不是距离'km'吗?

2 个答案:

答案 0 :(得分:0)

您需要确保时间正确格式化,并且永远不要输入浮点数。

您可以使用以下命令将float转换为分钟和小时:

# time = distance / speed
time = 2.75 # 2 hours + 45 minutes
result = '0 days {0:02.0f}:{1:02.0f}:00'.format(*divmod(time * 60, 60)).split(":")

 # => result = "0 days 02:45:00"

df['time'] = pd.to_timedelta(result)   #now it should work

答案 1 :(得分:0)

考虑使用.km属性。

演示:

In [33]: df
Out[33]:
    lat1   lon1     lat2   lon2
0 -77.85  80.23 -22.4532  62.45

In [34]: distance = x.apply(lambda x: great_circle((x['lat1'], x['lon1']),
                                                   (x['lat2'], x['lon2'])).km,
                                                   axis = 1)
#  ---->                                                                  ^^^

In [35]: distance
Out[35]:
0    6233.235674
dtype: float64

In [36]: df['time'] = pd.to_timedelta(distance/80,unit='h')

In [37]: df
Out[37]:
    lat1   lon1     lat2   lon2                   time
0 -77.85  80.23 -22.4532  62.45 3 days 05:54:55.605600