2017-08-22 1 views
1

J'ai un DataFrame avec trois colonnes, une date et deux fois. Il est comme ça:La conversion de l'objet pandas en timedelta donne NaT

  date hour_in hour_out 
0 01/06/2016  08:15  19:37 
1 02/06/2016  08:26  17:31 
2 03/06/2016  08:08  21:31 

Je suis en train de convertir hour_in et hour_out à timedelta en utilisant ce code (qui est basé sur une réponse sur cette question Dates from 1900-01-01 are added to my 'Time' after using df['Time'] = pd.to_datetime(phData['Time'], format='%H:%M:%S')):

df['hora_entrada'] = pd.to_timedelta(df['hora_entrada'], errors='coerce') 
df['hora_saida'] = pd.to_timedelta(df['hora_saida'] , errors='coerce') 

Après le casting, mon La colonne est convertie en le type correct timedelta64[ns], mais toutes les valeurs sont définies sur NaT. Mes df.info() renvoie cette:

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 439 entries, 0 to 438 
Data columns (total 4 columns): 
data   439 non-null datetime64[ns] 
hour_in   0 non-null timedelta64[ns] 
hour_out  0 non-null timedelta64[ns] 
dtypes: datetime64[ns](1), timedelta64[ns](2) 

et la sortie de données est comme ceci:

  data hora_entrada hora_saida 
0 2016-06-01   NaT  NaT 
1 2016-06-02   NaT  NaT 
2 2016-06-03   NaT  NaT 

J'ai essayé de convertir les colonnes de temps à datetime puis à timedelta mais j'ai obtenu des résultats étranges. Voici un exemple:

  data   hora_entrada   hora_saida 
0 2016-06-01 -25567 days +08:15:00 -25567 days +19:37:00 
1 2016-06-02 -25567 days +08:26:00 -25567 days +17:31:00 
2 2016-06-03 -25567 days +08:08:00 -25567 days +21:31:00 

Je pense qu'il est parce que quand je le convertir en datetime il est ajouté à l'heure une date 1900-01-01.

Répondre

0

Tenir compte l'approche suivante:

In [24]: pd.to_timedelta(df.hour_in + ':00', errors='coerce') 
Out[24]: 
0 08:15:00 
1 08:26:00 
2 08:08:00 
Name: hour_in, dtype: timedelta64[ns] 
+0

Merci! Cela a fonctionné avec votre solution. Pouvez-vous juste expliquer pourquoi cette approuch fonctionne et celle que j'essayais ne fonctionne pas? – aiquis

+0

@aiquis, 'pd.to_timedelta' attend soit une chaîne à temps plein (format:'% H:% M:% S'), soit un nombre numérique d'unités (secondes, millisecondes, microsecondes, nanosecondes) à partir du '1970-01- 01 00:00:00 UTC' ... – MaxU