熊猫得到组内的平均时间间隔

问题描述:

我有一个DataFrame包含EffectiveDate列。 我想通过Key值对DataFrame进行分组,然后计算每个组中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 

欲GROUPBY指数并计算在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] 

在单系列这似乎很好地工作:当我使用相同的功能,在大熊猫据帧一GROUPBY汇总然而

EffectiveDate.diff().astype('timedelta64[s]').mean() 

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.

我期望每列中的整数字段。我正在使用熊猫0.19.2

+0

的结果将是每个组中的'Key'列,这似乎不符合您的输出平均值。你能否包括你的完整数据框,以及你正在做什么? – miradulo

+0

另外,你使用的是什么版本的熊猫?我不能用0.18.1重现这一点。 – miradulo

+0

@你说得对。我无法在0.18.1中重现这一点,我正在使用0.19.2 – user113531

GroupBy.agg似乎试图将返回转换为0.19.2中EffectiveDate列的原始dtype。通常我认为这可能是有意义的,因为我们期望在列下面的聚合具有相同的dtype。

要解决此问题,您可以使用GroupBy.apply代替0.19.2,该代码之后不会执行相同的转换。

df.groupby(df.index).apply(
    lambda x: x.diff().astype('timedelta64[s]').mean() 
) 

貌似这并没有使用这样的情况,我只能铸造的EFFECTIVEDATE列的原始D型后重现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