如何为Pandas时间序列生成重采样周期内的累计值输出?
Pandas时间序列按周期重置的累计和计算
需求说明
需要对Pandas时间序列数据按指定周期(如季度)计算截至每个时间点的累计值,且每个周期开始后累计值重置重新计算,而非仅输出周期末的汇总值。
示例输入数据:
import numpy as np import pandas as pd import datetime as dt index = pd.date_range(dt.datetime(2021,1,1),dt.datetime(2021,12,1),freq='MS') data = np.repeat(1,12) df = pd.DataFrame(data=data,columns=['value'],index=index)
期望输出每个季度内的累计值:
cum_resampled_value 2021-01-01 1 2021-02-01 2 2021-03-01 3 2021-04-01 1 2021-05-01 2 2021-06-01 3 2021-07-01 1 2021-08-01 2 2021-09-01 3 2021-10-01 1 2021-11-01 2 2021-12-01 3
最优解决方案
使用groupby按周期分组后,对每组执行cumsum()即可实现需求,代码简洁高效:
# 按季度分组,计算组内累计和 df['cum_resampled_value'] = df.groupby(df.index.to_period('Q'))['value'].cumsum() # 查看结果 print(df[['cum_resampled_value']])
原方法报错原因分析
你尝试的expanding().apply()结合resample的方法在全量数据上报错,原因是:
expanding().apply()要求每个窗口的处理结果要么是标量,要么是和输入窗口长度一致的序列- 而
resample('Q').sum()会将窗口内的数据聚合为季度末的单个值,返回的序列长度远小于原窗口长度,无法匹配apply的要求,因此抛出TypeError: cannot convert the series to <class 'float'>
其他替代方案
如果需要更灵活的累计函数(如自定义累计逻辑),可以在groupby的apply中实现:
def custom_cumulative(group): # 这里可以替换为任意自定义累计逻辑,比如累计均值、累计最大值等 return group.cumsum() df['cum_resampled_value'] = df.groupby(df.index.to_period('Q'))['value'].apply(custom_cumulative)
内容的提问来源于stack exchange,提问作者agftrading
相关产品推荐
相关产品推荐

