Python 熊猫在群体内获得平均时间间隔

Python 熊猫在群体内获得平均时间间隔,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含EffectiveDate列的数据框。 我想按数据帧按键值分组,然后为EffectiveDate列计算每组中所有日期值的平均时间间隔 例如,对于数据帧: EffectiveDate 1 2015-08-17 07:00:00 1 2015-08-18 07:00:00 1 2015-08-19 07:00:00 2 2015-08-20 07:00:00 2 2015-08-21 07:00:00 2 2015-09-16 07:00:00 2 2

我有一个包含
EffectiveDate
列的数据框。 我想按数据帧按键值分组,然后为
EffectiveDate
列计算每组中所有日期值的平均时间间隔

例如,对于数据帧:

    EffectiveDate
1   2015-08-17 07:00:00
1   2015-08-18 07:00:00
1   2015-08-19 07:00:00
2   2015-08-20 07:00:00
2   2015-08-21 07:00:00
2   2015-09-16 07:00:00
2   2015-10-15 07:00:00
2   2015-11-16 08:00:00
df.groupby('Key').agg({
    'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean()
})
我想按索引分组并计算EffectiveDate列中日期值之间的平均间隔

15199   2015-08-17 07:00:00
15214   2015-08-18 07:00:00
15219   2015-08-19 07:00:00
15233   2015-08-20 07:00:00
15254   2015-08-21 07:00:00
15687   2015-09-16 07:00:00
199     2015-10-15 07:00:00
1123    2015-11-16 08:00:00
Name: EffectiveDate, dtype: datetime64[ns]
在单个系列上,这似乎效果不错:

EffectiveDate.diff().astype('timedelta64[s]').mean()
但是,当我在数据帧上使用与groupby聚合相同的函数时:

    EffectiveDate
1   2015-08-17 07:00:00
1   2015-08-18 07:00:00
1   2015-08-19 07:00:00
2   2015-08-20 07:00:00
2   2015-08-21 07:00:00
2   2015-09-16 07:00:00
2   2015-10-15 07:00:00
2   2015-11-16 08:00:00
df.groupby('Key').agg({
    'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean()
})
结果是

                  EffectiveDate                               
1 1970-01-01 00:00:00.016747425
2 1970-01-01 00:00:00.017765280
3 1970-01-01 00:00:00.034776096
4 1970-01-01 00:00:00.002052450
5 1970-01-01 00:00:00.018238800
6 1970-01-01 00:00:00.024005438 
7 1970-01-01 00:00:00.012330000
我希望每列中都有一个整数字段。我正在使用Pandas
0.19.2

似乎试图回溯到
0.19.2
中EffectiveDate列的原始数据类型。我认为这通常是有道理的,因为我们希望列下面的聚合具有相同的数据类型

要解决此问题,您可以改为在
0.19.2
中使用,它在以后不执行相同的强制转换

df.groupby(df.index).apply(
    lambda x: x.diff().astype('timedelta64[s]').mean()
)
以前似乎不是这样,因为我只能在转换为EffectiveDate列的原始数据类型后,才能在
0.18.1
中重现您的行为

0.18.1

>>> df
        EffectiveDate
1 2015-08-17 07:00:00
1 2015-08-18 07:00:00
1 2015-08-19 07:00:00
2 2015-08-20 07:00:00
2 2015-08-21 07:00:00
2 2015-09-16 07:00:00
2 2015-10-15 07:00:00
2 2015-11-16 08:00:00

>>> df.groupby(df.index).agg({
        'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean()
})

   EffectiveDate
1        86400.0
2      1901700.0

>>> df.groupby(df.index).agg({
        'EffectiveDate': lambda x: x.diff().astype('timedelta64[s]').mean()
}).astype(df.EffectiveDate.dtype)

                  EffectiveDate
1 1970-01-01 00:00:00.000086400
2 1970-01-01 00:00:00.001901700

结果将是
列中每组的平均值,这似乎与您的输出不符。你能提供完整的数据框和你正在做的事情吗?还有,你正在使用什么版本的熊猫?我不能用0.18.1复制它。@Mitch你是对的。我无法在0.18.1中复制这一点,我使用的是0.19.2非常奇怪,嗯。如果到那时还没有人来,我明天就试着给你测试一下。