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

时间:2017-06-11 00:46:29

标签: python python-2.7 python-3.x pandas gps

我为大量文本文件格式的车辆提供了大量带时间戳的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

有谁能建议我如何有效地隔离单独的旅程? Pandas的解决方案绝对不是必需的。

1 个答案:

答案 0 :(得分: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