熊猫得到组内的平均时间间隔
问题描述:
我有一个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
。
答
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
的结果将是每个组中的'Key'列,这似乎不符合您的输出平均值。你能否包括你的完整数据框,以及你正在做什么? – miradulo
另外,你使用的是什么版本的熊猫?我不能用0.18.1重现这一点。 – miradulo
@你说得对。我无法在0.18.1中重现这一点,我正在使用0.19.2 – user113531