it-swarm.com.de

Konvertieren Sie die timedelta64 [ns] -Spalte in Python Pandas DataFrame in Sekunden

Eine Pandas-DataFrame-Spalte duration enthält wie gezeigt timedelta64[ns]. Wie kannst du sie in Sekunden umwandeln?

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 folgendes versucht

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]]
28
Nyxynyx

Das funktioniert in der aktuellen Version von Pandas (Version 0.14) einwandfrei:

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

Hier ist ein Workaround 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-Ints (dtype '<i8') gespeichert. Das obige betrachtet die timedelta64s als 8-Byte-Ints und dann eine Ganzzahl Division, um Nanosekunden in Sekunden zu konvertieren.

Beachten Sie, dass Sie NumPy Version 1.7 oder neuer benötigen , um mit datetime64/timedelta64s zu arbeiten. 

41
unutbu

Ich habe gerade festgestellt, dass es sich um einen alten Thread handelt, der ohnehin hier bleibt, wenn Wanderer wie ich in der Suchmaschine nur auf die Top-5-Ergebnisse klicken und hier landen.

Stellen Sie sicher, dass Ihre Typen korrekt sind.

  • Wenn Sie DatumZeit in Sekunden konvertieren möchten, addieren Sie einfach die Sekunden für jede Stunde, Minute und Sekunde des DatumZeit-Objekts, wenn die Dauer innerhalb eines Datums liegt.

      • 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 Zeitdelta in Sekunden umrechnen möchten, verwenden Sie den folgenden Wert.

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

Ich habe es so zum Laufen gebracht:

die Spalten start_dt und end_dt haben folgendes 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]

Hatte meine Laufzeit im Format timedelta64 [ns], was Subtraktion von Start und Ende Datum/Uhrzeit-Werten war.

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

Die Spalte mit der resultierenden Dauer sieht folgendermaßen aus

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 hatte meine Dauer Sekunden zwischen zwei Daten in float. Einfacher zu 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 alle Dauer erhalten möchte, die mehr als 1 Sekunde ist.

Ich hoffe es hilft.

11
Gunay Anach

Verwenden Sie den Series dt-Accessor , um Zugriff auf die Methoden und Attribute einer Datum/Zeit-Serie (Timedelta) zu erhalten.

>>> s
0   -1 days +23:45:14.304000
1   -1 days +23:46:57.132000
2   -1 days +23:49:25.913000
3   -1 days +23:59:48.913000
4            00:00:00.820000
dtype: timedelta64[ns]
>>>
>>> s.dt.total_seconds()
0   -885.696
1   -782.868
2   -634.087
3    -11.087
4      0.820
dtype: float64

Datenähnliche Eigenschaften

5
wwii

Wir können einfach die Pandas apply () verwenden 

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)
1
Pardhu