【问题标题】:Splitting continuous GPS data into separate journeys将连续的 GPS 数据拆分为单独的旅程
【发布时间】:2017-11-12 17:55:48
【问题描述】:

我有大量文本文件格式的带有时间戳的 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 的解决方案绝对不是必需的。

【问题讨论】:

  • 新数据会是什么样子?我们是“隔离个人旅程”。
  • 我愿意接受任何建议。也许 UID 可以在新的文本文件中附加旅程 ID? ABC-001,ABC-002?数据中的新列给出了旅程的 ID?甚至对 Pandas 查询拆分数据的样子提供一些帮助。

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


【解决方案1】:

以下将数据框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

【讨论】:

  • 非常感谢您帮助DYZ!这真的很有帮助,我会进行更多调查。我想我可能需要一个 groupby['uid'] 在某个地方,以防不同车辆的轨迹在时间上重叠。
  • 只需在条件中添加类似df.uid.shift(-1).notnull() &amp; (df.uid.shift(-1)!=df.uid) 的内容。
猜你喜欢
  • 2013-12-13
  • 2014-04-13
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2018-12-10
  • 2020-03-28
  • 2015-01-15
  • 2022-01-14
相关资源
最近更新 更多