2014-10-20 19 views
15

Eine pandas DataFrame-Spalte duration enthält timedelta64[ns] wie gezeigt. Wie können Sie sie in Sekunden umwandeln?Konvertieren von timedelta64 [ns] -Spalte in Sekunden in Python Pandas DataFrame

0 00:20:32 
1 00:23:10 
2 00:24:55 
3 00:13:17 
4 00:18:52 
Name: duration, dtype: timedelta64[ns] 

Ich habe versucht, die folgende

print df[:5]['duration']/np.timedelta64(1, 's') 

bekam aber den Fehler

Traceback (most recent call last): 
    File "test.py", line 16, in <module> 
    print df[0:5]['duration']/np.timedelta64(1, 's') 
    File "C:\Python27\lib\site-packages\pandas\core\series.py", line 130, in wrapper 
    "addition and subtraction, but the operator [%s] was passed" % name) 
TypeError: can only operate on a timedeltas for addition and subtraction, but the operator [__div__] was passed 

Auch

versucht
print df[:5]['duration'].astype('timedelta64[s]') 

erhielt aber den Fehler

Traceback (most recent call last): 
    File "test.py", line 17, in <module> 
    print df[:5]['duration'].astype('timedelta64[s]') 
    File "C:\Python27\lib\site-packages\pandas\core\series.py", line 934, in astype 
    values = com._astype_nansafe(self.values, dtype) 
    File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1653, in _astype_nansafe 
    raise TypeError("cannot astype a timedelta from [%s] to [%s]" % (arr.dtype,dtype)) 
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [timedelta64[s]] 
+0

dies ist fest Neue Releases; Wie im [Quellcode] (https://github.com/pydata/pandas/flame/778cfe43a4cef52442e00fe505290079a717f515/pandas/core/ops.py#L304), wenn beide Seiten timedelta sind, werden Subtraktion und _division_ unterstützt. dieser Abschnitt des Codes wurde im Jahr 2013 geändert –

+0

@ behzad.nouri ist richtig, ich glaube, das wurde in> 0,13.1 behoben (vielleicht braucht 0,14), aber aktuell ist 0,15.0: http://pandas.pydata.org /pandas-docs/stable/timedeltas.html#frequency-conversion – Jeff

+0

@ behzad.nouri Danke, Update auf Pandas 0.15.0 und numpy 1.9.0 hat es zur Arbeit gebracht. – Nyxynyx

Antwort

28

Diese ordnungsgemäß in der aktuellen Version von Pandas arbeitet (Version 0.14):

In [132]: df[:5]['duration']/np.timedelta64(1, 's') 
Out[132]: 
0 1232 
1 1390 
2 1495 
3  797 
4 1132 
Name: duration, dtype: float64 

ist hier eine Abhilfe für ältere Versionen von Pandas/NumPy:

In [131]: df[:5]['duration'].values.view('<i8')/10**9 
Out[131]: array([1232, 1390, 1495, 797, 1132], dtype=int64) 

timedelta64 und datetime64 Daten werden intern als 8-Byte-Inte gespeichert (dtype '<i8'). So sieht das oben genannte die timedelta64s als 8-Byte-Ints und dann Ganzzahl Division, um Nanosekunden in Sekunden zu konvertieren.

Beachten Sie, dass Sie need NumPy version 1.7 or newer arbeiten mit datetime64/timedelta64s.

5

realisierten Nur es ist ein alter Thread, trotzdem ist es hier zu verlassen, wenn Wanderer wie ich nur auf Top-5-Ergebnisse auf der Suchmaschine klickt und endet hier oben.

Stellen Sie sicher, dass Ihre Typen korrekt sind.

  • Wenn Sie Datetime zu Sekunden, konvertieren nur Sekunden für jede Stunde, Minute zusammenzufassen und Sekunden des Datetime-Objekt, wenn seine Laufzeit innerhalb eines Datum.

      • Stunden - Stunden x 3600 = Sekunden
      • Minuten - Minuten x 60 = Sekunden
      • Sekunden - Sekunden

linear_df['duration'].dt.hour*3600 + linear_df['duration'].dt.minute*60 + linear_df['duration'].dt.second

  • Wenn Sie Timedelta zu Sekunden verwenden Sie den unten konvertieren möchten.

linear_df[:5]['duration'].astype('timedelta64[s]')

Ich habe es so zu arbeiten:

START_DT und end_dt Spalten sind in diesem Format:

import datetime 

linear_df[:5]['start_dt'] 

0 1970-02-22 21:32:48.000 
1 2016-12-30 17:47:33.216 
2 2016-12-31 09:33:27.931 
3 2016-12-31 09:52:53.486 
4 2016-12-31 10:29:44.611 
Name: start_dt, dtype: datetime64[ns] 

meine Dauer Hatte in timedelta64 [ns] Format, das war Subtraktion von Start und Ende Datetime-Werte.

linear_df['duration'] = linear_df['end_dt'] - linear_df['start_dt'] 

Resultierte Dauer Spalte wie folgt aussehen

linear_df[:5]['duration'] 

0   0 days 00:00:14 
1 2 days 17:44:50.558000 
2 0 days 15:37:28.418000 
3 0 days 18:45:45.727000 
4 0 days 19:21:27.159000 
Name: duration, dtype: timedelta64[ns] 

Mit Pandas ich zwischen zwei Terminen in float meine Dauer Sekunden hatte. Einfacher vergleichen oder filtern Sie Ihre Dauer danach.

linear_df[:5]['duration'].astype('timedelta64[s]') 

0  14.0 
1 236690.0 
2  56248.0 
3  67545.0 
4  69687.0 
Name: duration, dtype: float64 

In meinem Fall, wenn ich will alle Dauer erhalten, die länger als 1 Sekunde ist.

Ich hoffe, es hilft.

0

Wir können einfach die Pandas verwenden apply() Funktion

def get_seconds(time_delta): 
    return time_delta.seconds 

def get_microseconds(time_delta): 
    return time_delta.micro_seconds 

time_delta_series = df['duration'] 

converted_series = time_delta_series.apply(get_seconds) 
print(converted_series) 
Verwandte Themen