You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:27:23