2017-06-11 3 views
1

Ich habe eine große Stichprobe von Zeitstempel GPS-Daten für eine Reihe von Fahrzeugen im Textdateiformat. Jede Fahrzeugdaten hat eine eindeutige ID. Ich habe einfach einen Pandas-Datenrahmen erstellt und dann festgestellt, dass die GPS-Daten jedes einzelnen Fahrzeugs mehrere Monate lang durchgehend sind.Aufteilen kontinuierlicher GPS-Daten in separate Fahrten

Ich möchte einzelne Reisen isolieren, indem ich die Strecke spalte, wo die Lücke in der GPS-Berichterstattung ein bestimmtes Delta überschreitet (z. B. 10 Minuten). Ich glaube nicht, dass ich davon ausgehen kann, dass sich die Position zwischen dem Ende einer Reise und dem Beginn der nächsten nicht ändert (obwohl es sehr nah ist).

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 

Kann mir jemand vorschlagen, wie ich effizient getrennte Reisen isolieren könnte? Eine Lösung mit Pandas ist absolut nicht notwendig.

+0

Wie die neuen Daten aussehen würde? Wir sind "Isolate Individualreisen". – Grimmy

+0

Ich bin offen für irgendwelche Vorschläge. Vielleicht könnte der UID eine Reise-ID in einer neuen Textdatei angehängt werden? ABC-001, ABC-002? Eine neue Spalte in den Daten, die eine ID der Reise angibt? Oder sogar Hilfe, wie eine Pandas-Abfrage zum Teilen von Daten aussehen könnte. – Dan

Antwort

3

Die folgenden teilt den Datenrahmen df in eine Liste von Datenrahmen:

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

Vielen Dank für Ihre Hilfe DYZ! Das ist sehr hilfreich und ich werde mehr untersuchen. Ich denke, ich brauche vielleicht eine Gruppe von Leuten dort, falls die Spuren verschiedener Fahrzeuge sich zeitlich überlappen. – Dan

+1

Fügen Sie einfach etwas wie 'df.uid.shift (-1) .notnull() & (df.uid.shift (-1)! = Df.uid)' in die Bedingung ein. – DyZ

Verwandte Themen