2017-06-11 28 views
1

我有一個以大量文本文件格式的車輛爲時間標記的GPS數據樣本。每個車輛數據都有一個唯一的ID。我很容易地創建了熊貓數據框,然後意識到每個車輛的GPS數據實際上是連續數月的一個軌道。將連續的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 

任何人都可以建議如何有效地去隔離單獨的旅程嗎?熊貓解決方案絕對不是必需的。

+0

如何將新的數據是什麼樣子?我們「孤立個人旅程」。 – Grimmy

+0

我接受任何建議。也許UID可以在一個新的文本文件中附加旅程ID? ABC-001,ABC-002?數據中的新列提供旅程的ID?或者甚至有一些關於熊貓查詢可能看起來像分割數據的幫助。 – Dan

回答

3

以下拆分數據幀df到dataframes列表:

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 
+0

非常感謝您對DYZ的幫助!這真的很有幫助,我會進一步調查。我想我可能需要一個groupby ['uid']在那裏以防止不同車輛的軌道在時間上重疊。 – Dan

+1

只需將'df.uid.shift(-1).notnull()&(df.uid.shift(-1)!= df.uid)'添加到條件中即可。 – DyZ

相關問題