我如何才能获得groupby的平均日期
import pandas as pd
import numpy as np
df = pd.DataFrame ({'ID' : ['foo', 'bar'] * 5,
'VAL' : pd.date_range(start='4/1/2012', periods=10)})
ID VAL
foo 2012-04-01 00:00:00
bar 2012-04-02 00:00:00
bar 2012-04-04 00:00:00
foo 2012-04-05 00:00:00
bar 2012-04-06 00:00:00
foo 2012-04-07 00:00:00
bar 2012-04-08 00:00:00
foo 2012-04-09 00:00:00
bar 2012-04-10 00:00:00
期望的输出:
bar 06/04/2012
foo 05/04/2012
我该怎么做?
答案 0 :(得分:4)
只是一种替代方法(将日期时间值视为int64,这是它们的存储方式,然后返回):
In [11]: df['VAL'].astype('int64').groupby(df['ID']).mean().astype('datetime64[ns]')
Out[11]:
ID
bar 2012-04-06
foo 2012-04-05
dtype: datetime64[ns]
由于我们在这里使用视图,这应该比应用更有效/更快...
正如杰夫所指出的那样:这在主人(以及0.14.1)中得到了修复:
df.groupby('ID').mean()
应该“正常工作”。
答案 1 :(得分:3)
这需要timedeltas的平均值,然后加上开始日期(这应该更直接地在0.14.1 / master(即将推出)中工作,当你可以采用timedelta64的平均值时)
In [10]: m = df['VAL'].min()
In [11]: df.groupby('ID')['VAL'].apply(lambda x: (x-m).mean())+m
Out[11]:
ID
bar 0 2012-04-06
foo 0 2012-04-05
dtype: datetime64[ns]
答案 2 :(得分:0)
可能有更有效的方法,但一种方法是转换为序数,取平均值,然后转换回日期时间。
In [264]: df['VAL_ordinal'] = df['VAL'].apply(lambda x: x.toordinal())
In [267]: df.groupby('ID')['VAL_ordinal'].mean().apply(lambda x: datetime.fromordinal(int(x)))
Out[267]:
ID
bar 2012-04-06
foo 2012-04-05
Name: VAL_ordinal, dtype: datetime64[ns]