Convertir timedelta64 [ns] colonne en secondes dans Python Pandas DataFrame

Une colonne pandas DataFrame duration contient timedelta64[ns] comme indiqué. Comment Pouvez-vous les convertir en secondes?

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]

J'ai essayé ce qui suit

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

Mais a obtenu l'erreur

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print df[0:5]['duration'] / np.timedelta64(1, 's')
  File "C:Python27libsite-packagespandascoreseries.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

Également essayé

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

Mais a reçu l'erreur

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print df[:5]['duration'].astype('timedelta64[s]')
  File "C:Python27libsite-packagespandascoreseries.py", line 934, in astype
    values = com._astype_nansafe(self.values, dtype)
  File "C:Python27libsite-packagespandascorecommon.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]]
22
demandé sur Nyxynyx 2014-10-20 04:09:44

4 réponses

Cela fonctionne correctement dans la version actuelle de Pandas (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

Voici une solution de contournement pour les anciennes versions de Pandas / NumPy:

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

Les données Timedelta64 et datetime64 sont stockées en interne sous forme d'ints de 8 octets (dtype '<i8'). Donc, ce qui précède considère les timedelta64s comme des ints de 8 octets, puis fait un entier division pour convertir les nanosecondes en secondes.

Notez que vous avez besoin de NumPy version 1.7 ou plus récente pour fonctionner avec datetime64 / timedelta64s.

36
répondu unutbu 2017-07-19 11:22:57

Je viens de réaliser que c'est un vieux fil, de toute façon le laissant ici si wanderers comme moi clics seulement sur les 5 meilleurs résultats sur le moteur de recherche et finit par ici.

Assurez-vous que vos types sont corrects.

  • Si vous voulez convertir datetime en secondes , Il suffit de résumer les secondes pour chaque heure, minute et seconde de l'objet datetime si c'est pour la durée dans une date.

      • heures-Heures x 3600 = secondes
      • minutes-minutes X 60 = secondes
      • secondes secondes

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

  • Si vous voulez convertir timedelta à secondes utiliser un soufflet.

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

Je l'ai fait fonctionner comme ceci:

Les colonnes Start_dt et end_dt sont au format suivant:

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]

Avait ma durée au format timedelta64 [ns], qui était la soustraction de démarrer et end valeurs datetime.

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

La colonne de durée résultante ressemble à ceci

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]

En utilisant les pandas, j'avais mes secondes de durée entre deux dates dans float. Plus facile de comparer ou de filtrer votre durée par la suite.

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

Dans mon cas, si je veux obtenir toute la durée qui est supérieure à 1 seconde.

J'espère que ça aide.

7
répondu Gunay Anach 2017-02-04 19:44:49

Nous pouvons simplement utiliser les pandas appliquer() function

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
répondu Pardhu 2018-01-27 08:03:37

Utilisez la série dt accessor pour accéder aux méthodes et attributs d'une série datetime (timedelta).

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

Propriétés Datetimelike

1
répondu wwii 2018-05-25 14:34:48