Python pandas-将时间和空间函数应用于groupby

Python pandas-将时间和空间函数应用于groupby,python,datetime,pandas,Python,Datetime,Pandas,我有一个数据帧df,如下所示: User_ID;Latitude;Longitude;Datetime 222583401;41.4020375;2.1478710;2014-07-06 20:49:20 287280509;41.3671346;2.0793115;2013-01-30 09:25:47 329757763;41.5453577;2.1175164;2012-09-25 08:40:59 189757330;41.5844998;2.5621569;2013-10-01 11:

我有一个数据帧df,如下所示:

User_ID;Latitude;Longitude;Datetime
222583401;41.4020375;2.1478710;2014-07-06 20:49:20
287280509;41.3671346;2.0793115;2013-01-30 09:25:47
329757763;41.5453577;2.1175164;2012-09-25 08:40:59
189757330;41.5844998;2.5621569;2013-10-01 11:55:20
624921653;41.5931846;2.3030671;2013-07-09 20:12:20
414673119;41.5550136;2.0965829;2014-02-24 20:15:30
414673119;41.5550136;2.0975829;2014-02-24 20:16:30
414673119;41.5550136;2.0985829;2014-02-24 20:17:30
它包含有关用户的空间(纬度和经度)和时间(日期时间)位置的信息。所有用户都显示一个单一的时空位置,但最后一个是414673119,由三个时间和地点的样本移动跟踪。我想评估一个参数,比如用户的“速度”。我想使用应用于纬度/经度列的pandas函数,它与两个点之间的最短距离和欧几里得距离有关。 在第一步移动期间调用Lat1和Lat2在空间中的不同位置(Lon和Datetime相同),我可以计算:

distance_1_2 = math.sqrt((Lat2-Lat1)**2 + (Lon2-Lon1)**2)
time_1_2 = Datetime2 - Datetime1
然后:

speed_1_2 = distance_1_2/time_1_2
到目前为止,我按用户ID对数据帧进行排序和分组,以检测多个(和连续的)移动:

# Track User Movements in Space and Time - Sort Information
track = df.sort(['User_ID','Datetime'])
# MultiIndex --> Index on 'User_ID'
grouped = track.groupby(['User_ID'])
现在的问题是访问有关空间和时间的组信息,并使用高于或低于某个值的
速度
参数筛选用户。

非常感谢您的热情帮助。

您已经准备好了大部分物品。以下是一些可能会有所帮助的调整

  • 要计算序列中相邻值之间的差值,请使用
    diff
    方法。因此,例如,
    Lat2-Lat1
    将变成
    grp['Lat'].diff()

  • 如果
    Datetime
    列具有dtype
    datetime64[ns]
    ,则两个日期之间的差值
    df['Datetime'].diff()
    将为
    timedelta64[ns]
    。要将距离(浮点)除以
    timedelta64[ns]
    首先需要将
    timedelta64[ns]
    转换为浮点。要将其转换为秒数,请除以
    np.timedelta64(1,'s')

  • 您不需要按
    ['User\u ID','Datetime']
    排序。
    groupby
    方法可以很好地处理未排序的数据。所以跳过排序,直接打电话

    grouped = df.groupby(['User_ID'], group_keys=False)
    

屈服

     User_ID   Latitude  Longitude            Datetime
6  414673119  41.555014   2.097583 2014-02-24 20:16:30
7  414673119  41.555014   2.098583 2014-02-24 20:17:30

哇,太棒了!非常感谢!那么,在这种情况下,速度的测量单位是什么?时间是秒,但是距离呢?如果我想实现两点之间的大圆距离,该怎么办?
grouped = df.groupby(['User_ID'], group_keys=False)
import numpy as np
import pandas as pd

def speed(grp):
    dist = np.sqrt(grp['Latitude'].diff()**2 + grp['Longitude'].diff()**2)
    time = grp['Datetime'].diff() / np.timedelta64(1, 's')
    result = dist/time
    return result

df = pd.read_table('data', sep=';', parse_dates=[3])
grouped = df.groupby(['User_ID'], group_keys=False)
spd = grouped.apply(speed)
mask = spd > 1e-6
print(df.loc[mask])
     User_ID   Latitude  Longitude            Datetime
6  414673119  41.555014   2.097583 2014-02-24 20:16:30
7  414673119  41.555014   2.098583 2014-02-24 20:17:30