116 votes

extraction des 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 en utilisant la fonction 'to_datetime' sur un champ du df contenant des dates/heures.

Quand je soustrais s1 de s2

s3 = s2 - s1

J'obtiens 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 un élément de la série :

s3[10]

J'obtiens quelque chose comme ça :

numpy.timedelta64(2069211000000000,'ns')

Comment puis-je extraire les jours de s3 et les conserver sous forme d'entiers (je ne suis pas intéressé par les heures/minutes, etc.) ?

Merci d'avance pour toute aide.

184voto

Viktor Kerkez Points 11222

Vous pouvez le convertir en un timedelta avec une précision d'un jour. Pour extraire la valeur entière des jours, il faut la diviser par 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) depuis le timedelta est juste un entier 64bit qui est interprété de différentes manières en fonction du second paramètre que vous avez passé ( 'D' , 'ns' , ...).

Vous pouvez en savoir plus à ce sujet aquí .

64voto

Nickil Maveli Points 16776

Utilisez dt.days pour obtenir l'attribut "jours" sous forme d'entiers.

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 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 le hours attribut :

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

9voto

mgoldwasser Points 377

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 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 à définir la série comme un timedelta64 en jours, puis à le définir comme un int :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X