web-dev-qa-db-fra.com

Pandas Timedelta en jours

J'ai une trame de données dans pandas appelée 'munged_data' avec deux colonnes 'entry_date' et 'dob' que j'ai converties en horodatages à l'aide de pd.to_timestamp. J'essaie de comprendre comment calculer les âges de personnes en fonction de la différence de temps entre 'date_entrée' et 'dob' et pour ce faire, je dois obtenir la différence en jours entre les deux colonnes (afin que je puisse ensuite faire quelque chose comme rond (jours/365,25). Je ne le fais pas semble être en mesure de trouver un moyen de le faire en utilisant une opération vectorisée. Lorsque je fais munged_data.entry_date-munged_data.dob, j'obtiens ce qui suit:

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  

Cependant, il ne semble pas que je puisse extraire les jours sous forme d'entier pour pouvoir continuer mon calcul. Toute aide appréciée.

25
luckyfool

Vous avez besoin de 0.11 pour cela (0.11rc1 est sorti, dernier test la semaine prochaine)

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

Vous avez besoin de cette étrange application à la fin, car la prise en charge des scalaires timedelta64 [ns] n'est pas encore complète (par exemple, comme nous utilisons maintenant les horodatages pour datetime64 [ns], à partir de 0,12)

17
Jeff

En utilisant le type Pandas type Timedelta disponible depuis la v0.15.0, vous pouvez également:

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
44
DanT

Je ne sais pas si vous en avez toujours besoin, mais dans Pandas 0,14 j'utilise généralement la méthode .astype ('timedelta64 [X]')) http: // pandas. pydata.org/pandas-docs/stable/timeseries.html (conversion de fréquence)

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

Résultats:

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

Résultats:

  0   -4
 dtype: float64

J'espère que cela vous aidera

12
Ayrat

Précisons que vous avez une série pandas nommée time_difference qui a le type numpy.timedelta64 [ns]

Une façon d'extraire uniquement le jour (ou tout autre attribut souhaité) est la suivante:

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

Cette fonction est utilisée car l'objet numpy.timedelta64 n'a pas d'attribut "jours".

6
Daniel Gibson

Pour convertir tout type de données en jours, utilisez simplement Timedelta (). Jours:

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