将连续的GPS数据拆分为不同的旅程

Dan*_*Dan 2 python gps python-2.7 python-3.x pandas

我有大量时间戳的GPS数据样本,用于文本文件格式的许多车辆.每辆车数据都有一个唯一的ID.我轻松地创建了一个Pandas数据帧,然后意识到每个车辆的GPS数据实际上是几个月的连续轨道.

我想做的是通过分割GPS报告中的差距超过某个增量(例如10分钟)的轨道来隔离个别旅程.我不认为我可以假设一个旅程的结束和下一个旅程的开始之间的位置没有变化(尽管它/应该/非常接近).

uid   ts                     lat      lon
ABC   2017-01-01 00:00:00    0.0000   0.0000
ABC   2017-01-01 00:00:05    0.0000   0.0100
ABC   2017-01-01 00:00:10    0.0000   0.0200
ABC   2017-01-01 00:10:00    0.0100   0.0300 <--- New Journey. 10 min delta 
ABC   2017-01-01 00:10:05    0.0100   0.0400
ABC   2017-01-01 00:10:10    0.0100   0.0500
ABC   2017-01-01 00:10:15    0.0100   0.0600
DEF   2017-01-01 20:00:00    1.0000   1.0000
DEF   2017-01-01 20:00:05    1.0000   1.0100
DEF   2017-01-01 20:00:10    1.0000   1.0200
DEF   2017-01-01 20:20:00    1.0100   1.0300 <--- New Journey. 20 min delta 
DEF   2017-01-01 20:20:05    1.0100   1.0400
DEF   2017-01-01 20:20:10    1.0100   1.0500
DEF   2017-01-01 20:20:15    1.0100   1.0600
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我如何有效地隔离单独的旅程?Pandas的解决方案绝对不是必需的.

DYZ*_*DYZ 5

以下内容将数据帧拆分为数据帧df列表:

delta = pd.to_timedelta(10, unit='m')

breaks = df['ts'].diff() > delta # Feel free to add other conditions!
#0     False
#....
#6     False
#7      True
#8     False
#9     False
#10     True
#11    False
#12    False
#13    False
#Name: ts, dtype: bool

break_locs = df[breaks].index
#Int64Index([7, 10], dtype='int64')

trips = np.array_split(df, break_locs)
#[   uid                  ts   lat   lon
#0  ABC 2017-01-01 00:00:00  0.00  0.00
#1  ABC 2017-01-01 00:00:05  0.00  0.01
#2  ABC 2017-01-01 00:00:10  0.00  0.02
#3  ABC 2017-01-01 00:10:00  0.01  0.03
#4  ABC 2017-01-01 00:10:05  0.01  0.04
#5  ABC 2017-01-01 00:10:10  0.01  0.05
#6  ABC 2017-01-01 00:10:15  0.01  0.06,    uid                  ts  lat   lon
#7  DEF 2017-01-01 20:00:00  1.0  1.00
#8  DEF 2017-01-01 20:00:05  1.0  1.01
#9  DEF 2017-01-01 20:00:10  1.0  1.02,     uid                  ts   lat   lon
#10  DEF 2017-01-01 20:20:00  1.01  1.03
#11  DEF 2017-01-01 20:20:05  1.01  1.04
#12  DEF 2017-01-01 20:20:10  1.01  1.05
#13  DEF 2017-01-01 20:20:15  1.01  1.06]

len(trips)
#3
Run Code Online (Sandbox Code Playgroud)