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.
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)
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
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
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".
Pour convertir tout type de données en jours, utilisez simplement Timedelta (). Jours:
pd.Timedelta(1985, unit='Y').days
84494