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é le suivant
print df[:5]['duration'] / np.timedelta64(1, 's')
mais j'ai eu 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:\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
Aussi 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:\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]]
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'intes de 8 octets (dtype '<i8'
). Ainsi, l’opinion ci-dessus considère les timedelta64s comme des entiers de 8 octets, puis effectue une division entière Pour convertir les nanosecondes en secondes.
Notez que vous avez besoin de NumPy version 1.7 ou plus récente pour travailler avec datetime64/timedelta64s.
Utilisez l'accesseur Series dt
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
Nous pouvons simplement utiliser les pandas apply () 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)