2016-07-15 5 views
0

Ich möchte eine while-Schleife verwenden, um den Zeitunterschied zwischen der aktuellen Zeile und der vorherigen Zeile in einem Pandas-Datenrahmen zu ermitteln. Um etwas Kontext zu machen, hier ist mein Beispielcode:Objekt als Datetime vor While-Schleife speichern

counter = len(data)-1 
last = pd.to_datetime(data['time'], infer_datetime_format=True) 
current = last 
while((last-current).seconds() <= 60 and counter>-1): 
       # Do something 
     data[counter] 

Allerdings erhielt ich diese Fehlermeldung:

AttributeError: 'Series' object has no attribute 'seconds' 

Von dem, was ich verstehe, ist datetime Funktionen nicht mit Pandas Serie arbeiten, so gibt es bei mindestens zwei Möglichkeiten, mit der Lösung diese gehen zu:

1) Shop last als Datum Objekt Vorteil der .seconds()datetime Funktion zu übernehmen

2) Verwenden Sie die Pandas Version der (last-current).seconds()datetime Funktion

Jede Hilfe ist sehr zu schätzen!

angebaute Datenstruktur Beispiel

{'time': {0: Timestamp('2016-03-28 23:23:12'), 1: Timestamp('2016-03-28 23:23:32'), 2: Timestamp('2016-03-28 23:23:52'), 3: Timestamp('2016-03-28 23:24:12'), 4: Timestamp('2016-03-28 23:22:12'), 5: Timestamp('2016-03-28 23:24:32'), 6: Timestamp('2016-03-28 23:24:52'), 7: Timestamp('2016-03-28 23:25:32'), 8: Timestamp('2016-03-28 23:30:12'), 9: Timestamp('2016-03-28 23:29:12')}, 'Origin': {0: 'Boston', 1: 'New York', 2: 'Boston', 3: 'New York', 4: 'Hawaii', 5: 'Hawaii', 6: 'Miami', 7: 'Las Vegas', 8: 'Hawaii', 9: 'New York'}, 'Destination': {0: 'Miami', 1: 'Miami', 2: 'Miami', 3: 'Boston', 4: 'Boston', 5: 'New York', 6: 'Las Vegas', 7: 'Las Vegas', 8: 'Las Vegas', 9: 'Los Angeles'}} 

+2

Was die Struktur Ihrer Daten? Können wir eine Probe sehen? –

+1

Wenn Sie bereits einen DataFrame oder eine Serie haben, könnten Sie bitte die Ausgabe von 'data.head (10) .to_dict()' posten? –

Antwort

1

Ich glaube, das ist das, was Sie brauchen:

data['time'].diff() 

Hier ist der Ausgang ist:

0     NaT 
1   00:00:20 
2   00:00:20 
3   00:00:20 
4 -1 days +23:58:00 
5   00:02:20 
6   00:00:20 
7   00:00:40 
8   00:04:40 
9 -1 days +23:59:00 
Name: time, dtype: timedelta64[ns] 

Als Reaktion auf den Kommentar bearbeiten

Es gibt mehrere Möglichkeiten, wie Sie die gesamten Sekunden erreichen können.

In [12]: data['time'].diff()/np.timedelta64(1, 's') 
Out[12]: 
0 NaN 
1  20 
2  20 
3  20 
4 -120 
5 140 
6  20 
7  40 
8 280 
9 -60 
Name: time, dtype: float64 

In [13]: timeit data['time'].diff()/np.timedelta64(1, 's') 
1000 loops, best of 3: 738 µs per loop 

In [14]: data['time'].diff().map(lambda td: td.item(), na_action='ignore')*1e-9 
Out[14]: 
0 NaN 
1  20 
2  20 
3  20 
4 -120 
5 140 
6  20 
7  40 
8 280 
9 -60 
Name: time, dtype: object 


In [15]: timeit data['time'].diff().map(lambda td: td.item(), na_action='ignore')*1e-9 
1000 loops, best of 3: 381 µs per loop 

Oder noch besser:

In [17]: np.divide(data['time'].diff() , np.timedelta64(1, 's')) 
Out[17]: 
0 NaN 
1  20 
2  20 
3  20 
4 -120 
5 140 
6  20 
7  40 
8 280 
9 -60 
Name: time, dtype: float64 

timeit np.divide(data['time'].diff() , np.timedelta64(1, 's')) 
The slowest run took 4.27 times longer than the fastest. This could mean that an intermediate result is being cached 
10000 loops, best of 3: 155 µs per loop 
+0

Ich bin mir nicht sicher, ob diese Antwort funktioniert. Zum einen können wir nicht überprüfen, ob der Zeitunterschied zwischen der aktuellen und der vorherigen Zeile aufgrund einer ungültigen Syntax 60 Sekunden beträgt. –

+0

@ Provisional.Modulation überprüfen Sie die Bearbeitung. Ich bin mir nicht sicher, wie Sie mit negativen Zeitunterschieden umgehen wollen, aber von diesem Punkt an sollte es einfach sein, zu tun, was immer Sie wollen. –