2014-10-20 13 views
15

Una colonna DataFrame panda duration contiene timedelta64[ns] come mostrato. Come puoi convertirli in secondi?Converti la colonna timedelta64 [ns] in secondi in Python Pandora 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] 

ho provato la seguente

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

ma ottenuto l'errore

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 

provato anche

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

ma ha ricevuto l'errore

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

questo è rilasci fissi recenti; come nel [codice sorgente] (https://github.com/pydata/pandas/blame/778cfe43a4cef52442e00fe505290079a717f515/pandas/core/ops.py#L304), se entrambi i lati sono timedelta l'addizione, la sottrazione e _divisione_ sono supportati. quella parte del codice è stata modificata nel 2013 –

+0

@ behzad.nouri ha ragione, credo che questo sia stato corretto in> 0.13.1 (forse ha bisogno di 0.14), ma la corrente è 0.15.0: http://pandas.pydata.org /pandas-docs/stable/timedeltas.html#frequency-conversion – Jeff

+0

@ behzad.nouri Grazie, l'aggiornamento a Pandas 0.15.0 e numpy 1.9.0 ha funzionato. – Nyxynyx

risposta

28

Questo funziona correttamente nella versione corrente di Panda (versione 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 

Ecco una soluzione per le vecchie versioni di Panda/NumPy:

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

timedelta64 e datetime64 dati sono memorizzati internamente come 8 byte int (dtype '<i8'). Quindi le viste precedenti timedelta64s come 8 byte int e quindi intero intero divisione per convertire i nanosecondi in secondi.

Nota che è possibile eseguire l'operazione need NumPy version 1.7 or newer con datetime64/timedelta64s.

5

appena realizzato è un vecchio filo, comunque lasciando qui se vagabondi come me scatta solo sui primi 5 risultati sul motore di ricerca e finisce qui.

Assicurarsi che i tipi siano corretti.

  • Se si desidera convertire datetime a secondi, basta riassumere secondi per ogni ora, minuti e secondi dell'oggetto datetime se per la durata entro un data.

      • ore - ore x 3600 = secondi
      • minuti - minutes x 60 = secondi
      • secondi - secondi
    • 0.123.516,410617 millions

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

  • Se si desidera convertire timedelta a secondi usano quello soffietto.

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

ho preso a lavorare in questo modo:

start_dt e end_dt colonne sono in questo formato:

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] 

avuto la mia durata in timedelta64 formato [NS], che è stata sottrazione di start e fine valori datetime.

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

colonna durata Portato simile a questa

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] 

Uso panda ho avuto la mia durata secondi tra due date in float. Più facile per confrontare o filtrare la tua durata in seguito.

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 

Nel mio caso, se voglio ottenere tutta la durata che è più di 1 secondo.

Spero che aiuti.

0

Possiamo semplicemente utilizzare i panda Applica() funzione

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) 
Problemi correlati