web-dev-qa-db-fra.com

extraction de jours d'une valeur numpy.timedelta64

J'utilise pandas/python et j'ai deux séries chronologiques de dates, s1 et s2, qui ont été générées à l'aide de la fonction 'to_datetime' sur un champ de la df contenant les dates/heures.

Quand je soustrais s1 de s2

s3 = s2 - s1

Je reçois une série, s3, de type

timedelta64 [ns]

0    385 days, 04:10:36
1     57 days, 22:54:00
2    642 days, 21:15:23
3    615 days, 00:55:44
4    160 days, 22:13:35
5    196 days, 23:06:49
6     23 days, 22:57:17
7      2 days, 22:17:31
8    622 days, 01:29:25
9     79 days, 20:15:14
10    23 days, 22:46:51
11   268 days, 19:23:04
12                  NaT
13                  NaT
14   583 days, 03:40:39

Comment regarder 1 élément de la série:

s3 [10]

Je reçois quelque chose comme ça:

numpy.timedelta64 (2069211000000000, 'ns')

Comment puis-je extraire des jours de s3 et peut-être les conserver sous forme de nombres entiers (non intéressé par les heures/minutes, etc.)?

Merci d'avance pour votre aide.

65
user7289

Vous pouvez le convertir en timedelta avec une précision journalière. Pour extraire la valeur entière de jours, vous la divisez avec un timedelta d'un jour.

>>> x = np.timedelta64(2069211000000000, 'ns')
>>> days = x.astype('timedelta64[D]')
>>> days / np.timedelta64(1, 'D')
23

Ou, comme l’a suggéré @PhillipCloud, juste days.astype(int) puisque le timedelta n’est qu’un entier de 64 bits interprété de différentes manières en fonction du deuxième paramètre que vous avez transmis ('D', 'ns', ...).

Vous pouvez trouver plus à ce sujet ici .

112
Viktor Kerkez

Utilisation dt.days pour obtenir l’attribut days sous forme d’entiers.

Pour par exemple:

In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T'))

In [15]: s
Out[15]: 
0    1 days 00:00:00
1    3 days 02:00:00
2    5 days 04:00:00
3    7 days 06:00:00
4    9 days 08:00:00
5   11 days 10:00:00
dtype: timedelta64[ns]

In [16]: s.dt.days
Out[16]: 
0     1
1     3
2     5
3     7
4     9
5    11
dtype: int64

Plus généralement, vous pouvez utiliser le .components propriété pour accéder à une forme réduite de timedelta.

In [17]: s.dt.components
Out[17]: 
   days  hours  minutes  seconds  milliseconds  microseconds  nanoseconds
0     1      0        0        0             0             0            0
1     3      2        0        0             0             0            0
2     5      4        0        0             0             0            0
3     7      6        0        0             0             0            0
4     9      8        0        0             0             0            0
5    11     10        0        0             0             0            0

Maintenant, pour obtenir l'attribut hours:

In [23]: s.dt.components.hours
Out[23]: 
0     0
1     2
2     4
3     6
4     8
5    10
Name: hours, dtype: int64
28
Nickil Maveli

Supposons que vous ayez une série timedelta:

import pandas as pd
from datetime import datetime
z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]})

td_series = (z['a'] - z['b'])

Une façon de convertir cette colonne ou cette série timedelta consiste à la convertir en un objet Timedelta (pandas 0.15.0+), puis à extraire les jours de l'objet:

td_series.astype(pd.Timedelta).apply(lambda l: l.days)

Une autre méthode consiste à convertir la série en timedelta64 en jours, puis en un entier:

td_series.astype('timedelta64[D]').astype(int)
6
mgoldwasser