web-dev-qa-db-fra.com

Convertissez la colonne timedelta64 [ns] 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é 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]]
28
Nyxynyx

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. 

41
unutbu

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

Propriétés similaires à celles des données

5
wwii

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