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