Pandas Timedelta en días

Tengo un dataframe en pandas llamado ‘munged_data’ con dos columnas ‘entry_date’ y ‘dob’ que he convertido en marcas de tiempo usando pd.to_timestamp. Estoy tratando de averiguar cómo calcular las edades de las personas según la diferencia de tiempo entre entry_date ‘and’ dob ‘y para hacer esto, necesito obtener la diferencia en días entre las dos columnas (para que luego pueda hacer algo como round (días / 365.25). Parece que no puedo encontrar una manera de haga esto usando una operación vectorizada. Cuando hago munged_data.entry_date-munged_data.dob obtengo lo siguiente:

internal_quote_id 2 15685977 days, 23:54:30.457856 3 11651985 days, 23:49:15.359744 4 9491988 days, 23:39:55.621376 7 11907004 days, 0:10:30.196224 9 15282164 days, 23:30:30.196224 15 15282227 days, 23:50:40.261632 

Sin embargo, no parece poder extraer los días como un número entero para poder continuar con mi cálculo. Cualquier ayuda apreciada.

Necesitas 0.11 para esto (0.11rc1 está fuera, último problema la próxima semana)

 In [9]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ]) In [10]: df Out[10]: 0 0 2001-01-01 00:00:00 1 2004-06-01 00:00:00 In [11]: df = DataFrame([ Timestamp('20010101'), Timestamp('20040601') ],columns=['age']) In [12]: df Out[12]: age 0 2001-01-01 00:00:00 1 2004-06-01 00:00:00 In [13]: df['today'] = Timestamp('20130419') In [14]: df['diff'] = df['today']-df['age'] In [16]: df['years'] = df['diff'].apply(lambda x: float(x.item().days)/365) In [17]: df Out[17]: age today diff years 0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00 12.304110 1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00 8.887671 

Necesita esta aplicación impar al final porque todavía no es compatible con los escalares de timedelta64 [ns] (p. Ej., Cómo usamos las marcas de tiempo ahora para datetime64 [ns], que vienen en 0.12)

Usando el tipo de Pandas Timedelta disponible desde v0.15.0 también puede hacer:

 In[1]: import pandas as pd In[2]: df = pd.DataFrame([ pd.Timestamp('20150111'), pd.Timestamp('20150301') ], columns=['date']) In[3]: df['today'] = pd.Timestamp('20150315') In[4]: df Out[4]: date today 0 2015-01-11 2015-03-15 1 2015-03-01 2015-03-15 In[5]: (df['today'] - df['date']).dt.days Out[5]: 0 63 1 14 dtype: int64 

No estoy seguro de si todavía lo necesitas, pero en Pandas 0.14 por lo general uso el método .astype (‘timedelta64 [X]’) http://pandas.pydata.org/pandas-docs/stable/timeseries.html (conversión de frecuencia)

 df = pd.DataFrame([ pd.Timestamp('20010101'), pd.Timestamp('20040605') ]) df.ix[0]-df.ix[1] 

Devoluciones:

 0 -1251 days dtype: timedelta64[ns] 
 (df.ix[0]-df.ix[1]).astype('timedelta64[Y]') 

Devoluciones:

  0 -4 dtype: float64 

Espero que ayude

Especifiquemos que tienes una serie de pandas llamada time_difference que tiene el tipo numpy.timedelta64 [ns]

Una forma de extraer solo el día (o cualquier atributo deseado) es la siguiente:

 just_day = time_difference.apply(lambda x: pd.tslib.Timedelta(x).days) 

Esta función se utiliza porque el objeto numpy.timedelta64 no tiene un atributo de “días”.

Para convertir cualquier tipo de datos en días solo use Timedelta (). Días:

 pd.Timedelta(1985, unit='Y').days 84494