2017-10-24 2 views
1

Ich habe einen Datenrahmen durch datetime indiziert. Ich möchte Zeilen basierend auf dem Unterschied zwischen ihrem Index und dem Index der vorherigen Zeile herausfiltern. SoFilterung Pandas Datenrahmen durch Differenz von benachbarten Zeilen

, wenn meine Kriterien „alle Zeilen entfernen, die mehr als eine Stunde zu spät, als die vorhergehende Zeile“, die zweite Zeile im Beispiel unten entfernt werden soll:

2005-07-15 17:00:00 
2005-07-17 18:00:00 

Während im folgenden Fall, beide Reihen bleiben:

2005-07-17 23:00:00 
2005-07-18 00:00:00 
+0

, was mit der 19.00 Uhr in '2005-07-15 17.00.00, 2005-07-17 18.00.00, 2005-07-17 19.00 Uhr passieren sollte: 00 ' –

+0

aber fifference zwischen' 2005-07-17 23: 00: 00 ' '2005-07-18 00: 00: 00' einer Stunde wird, warum nicht entfernt? – jezrael

+0

aus dieser Serie: 'pd.Timestamp ('20170101') + pd.to_timedelta ([- 1, 0, 1, 2, 3, 5, 6,5, 7,5], Einheit = 'h')', können Sie deutlich machen, Welches sollte aufbewahrt werden? –

Antwort

2

Es Sie Unterschied brauchen boolean indexing mit diff scheint und vergleichen mit 1 hour Timedelta:

dates=['2005-07-15 17:00:00','2005-07-17 18:00:00', '2005-07-17 19:00:00', 
     '2005-07-17 23:00:00', '2005-07-18 00:00:00'] 
df = pd.DataFrame({'a':range(5)}, index=pd.to_datetime(dates)) 

print (df) 
        a 
2005-07-15 17:00:00 0 
2005-07-17 18:00:00 1 
2005-07-17 19:00:00 2 
2005-07-17 23:00:00 3 
2005-07-18 00:00:00 4 

diff = df.index.to_series().diff().fillna(0) 
print (diff) 
2005-07-15 17:00:00 0 days 00:00:00 
2005-07-17 18:00:00 2 days 01:00:00 
2005-07-17 19:00:00 0 days 01:00:00 
2005-07-17 23:00:00 0 days 04:00:00 
2005-07-18 00:00:00 0 days 01:00:00 
dtype: timedelta64[ns] 

mask = diff <= pd.Timedelta(1, unit='h') 
print (mask) 
2005-07-15 17:00:00  True 
2005-07-17 18:00:00 False 
2005-07-17 19:00:00  True 
2005-07-17 23:00:00 False 
2005-07-18 00:00:00  True 
dtype: bool 

df = df[mask] 
print (df) 
        a 
2005-07-15 17:00:00 0 
2005-07-17 19:00:00 2 
2005-07-18 00:00:00 4 
Verwandte Themen