2016-05-31 14 views
1

Ich möchte die letzten paar Zeilen behalten, aber so, dass, sobald es eine Zeitlücke über 100ms gibt, den Rest des Datenrahmens abgeschnitten. Zum Beispiel:Pandas - Abschneiden von Datenrahmen auf einer Zeitlücke

Eingang:

  Time X 
0 12:30:00.00 A 
1 12:30:00.100 B 
2 12:30:00.202 C 
3 12:30.00.300 D 

Ausgabe

  Time X 
2 12:30:00.202 C 
3 12:30.00.300 D 

Erläuterung: Es gibt mehr als 100 ms zwischen den Reihen B und C, so werfen wir alles über Reihe C entfernt

+0

Was ist Ihr erwartetes Verhalten wh Gibt es mehrere 100ms + Lücken in den Daten? Nehmen Sie die letzte Gruppe an den Lücken vorbei? –

+0

Nein, trunkiere beim ersten Mal 100ms Lücke, und beim ersten Mal meine ich vom Ende bis zum Anfang (oben). –

Antwort

2

Sie kann diff im Vergleich mit Timedelta von to_timedelta verwenden, dann cumsum mit Vergleich zu 1. Letzte Nutzung boolean indexing:

df['Time']= pd.to_datetime(df['Time'], format='%H:%M:%S.%f') 

print (df) 
        Time X 
0 1900-01-01 12:30:00.000 A 
1 1900-01-01 12:30:00.100 B 
2 1900-01-01 12:30:00.202 C 
3 1900-01-01 12:30:00.300 D 

print (df.Time.diff()) 
0    NaT 
1 00:00:00.100000 
2 00:00:00.102000 
3 00:00:00.098000 
Name: Time, dtype: timedelta64[ns] 

mask = (((df.Time.diff() > pd.to_timedelta('00:00:00.100000')).cumsum()) >= 1) 
print (mask) 
0 False 
1 False 
2  True 
3  True 
Name: Time, dtype: bool 

print (df[mask]) 
        Time X 
2 1900-01-01 12:30:00.202 C 
3 1900-01-01 12:30:00.300 D 

Wenn Notwendigkeit Spalte Time nicht Nationalstandard-Split auf dem ersten Wert, der höher als 100ms geändert:

df['Time1']= pd.to_datetime(df['Time'], format='%H:%M:%S.%f') 
print (df) 
      Time X     Time1 
0 12:30:00.00 A 1900-01-01 12:30:00.000 
1 12:30:00.100 B 1900-01-01 12:30:00.100 
2 12:30:00.202 C 1900-01-01 12:30:00.202 
3 12:30:00.300 D 1900-01-01 12:30:00.300 
1 12:30:00.100 E 1900-01-01 12:30:00.100 
2 12:30:00.202 F 1900-01-01 12:30:00.202 

print (df.Time1.diff()) 
0      NaT 
1   00:00:00.100000 
2   00:00:00.102000 
3   00:00:00.098000 
1 -1 days +23:59:59.800000 
2   00:00:00.102000 
Name: Time1, dtype: timedelta64[ns] 

mask = (((df.Time1.diff() > pd.to_timedelta('00:00:00.100000')).cumsum()) >= 1) 
print (mask) 
0 False 
1 False 
2  True 
3  True 
1  True 
2  True 
Name: Time1, dtype: bool 

print (df[mask].drop('Time1',axis=1)) 
      Time X 
2 12:30:00.202 C 
3 12:30:00.300 D 
1 12:30:00.100 E 
2 12:30:00.202 F 

Wenn nach letzten Wert geteilt Bedarf:

print (df) 
      Time X 
0 12:30:00.00 A 
1 12:30:00.100 B 
2 12:30:00.202 C 
3 12:30:00.300 D 
1 12:30:00.100 E 
2 12:30:00.202 F 

#create helper series 
time_ser= pd.to_datetime(df['Time'], format='%H:%M:%S.%f') 
#get differences 
print (time_ser.diff()) 
0      NaT 
1   00:00:00.100000 
2   00:00:00.102000 
3   00:00:00.098000 
1 -1 days +23:59:59.800000 
2   00:00:00.102000 
Name: Time, dtype: timedelta64[ns] 
#compare with 100ms timedalta 
mask = (((time_ser.diff() > pd.to_timedelta('00:00:00.100000')).cumsum())) 
print (mask) 
0 0 
1 0 
2 1 
3 1 
1 1 
2 2 
Name: Time, dtype: int32 

#get last value of mask 
last_val = mask.iat[-1] 
print(last_val) 
2 

#compare mask with last value and use boolean indexing 
print (df[mask == last_val]) 
      Time X 
2 12:30:00.202 F 
+0

Ich bearbeite die Antwort, indem ich nach dem letzten Wert splitte, bitte prüfe die Lösung. Vielen Dank. – jezrael

Verwandte Themen