tutorial index español python numpy pandas

python - index - extrayendo días de un valor numpy.timedelta64



python pandas operations (3)

Estoy usando pandas / python y tengo dos series de fecha y hora s1 y s2, que se han generado usando la función ''to_datetime'' en un campo del df que contiene fechas / horas.

Cuando restamos s1 de s2

s3 = s2 - s1

Obtengo una serie, s3, de tipo

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

¿Cómo veo un elemento de la serie?

s3 [10]

Obtengo algo como esto:

numpy.timedelta64 (2069211000000000, ''ns'')

¿Cómo extraigo los días de s3 y quizás los guardo como enteros (no me interesan tanto las horas / minutos, etc.)?

Gracias de antemano por cualquier ayuda.


Puede convertirlo en un timedelta con precisión de un día. Para extraer el valor entero de los días, divídelo con un timedelta de un día.

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

O, como @PhillipCloud sugirió, solo days.astype(int) ya que timedelta es solo un entero de 64 bits que se interpreta de varias maneras dependiendo del segundo parámetro que pasó ( ''D'' , ''ns'' , ...).

Puedes encontrar más sobre esto here .


Supongamos que tiene una serie 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''])

Una forma de convertir esta columna o serie timedelta es convertirlo en un objeto Timedelta (pandas 0.15.0+) y luego extraer los días del objeto:

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

Otra forma es lanzar la serie como timedelta64 en días y luego convertirla en int.

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


Use dt.days para obtener el atributo de días como enteros.

Por ejemplo:

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

De manera más general: puede usar la propiedad .components para acceder a una forma reducida 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

Ahora, para obtener el atributo de 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