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

pandas如何适配不同月份天数按自定义周期计算列分段累计和

问题说明

现有如下结构的DataFrame:

CODE      DATE     PP
17594  000130 1991-01-01  0.5
17595  000130 1991-01-02  11
...
28459  000130 1991-12-31  0

需要对PP列按每月3个分段计算总和,分段规则:

  • 第一段:每月1日至10日
  • 第二段:每月11日至20日
  • 第三段:每月21日至当月最后一天,自动适配不同月份天数:31天的月份覆盖11天、平年2月覆盖8天、闰年2月覆盖9天、30天的月份覆盖10天

之前使用df['PP'].resample('10D').sum()的方案是固定10天为周期分段,无法适配不同月份的天数差异,会出现跨月分段、长度不符合要求的问题。
预期输出为每个分段一条记录,DATE取分段的起始日期,PP为分段内数值总和,格式参考:

CODE      DATE     PP
17594  000130 1991-01-01  39.5
17595  000130 1991-01-11  36
17596  000130 1991-01-21  39
...
实现方案

核心逻辑是先为每一行数据匹配所属的「年-月-分段」分组标签,再按分组聚合求和,避免固定周期重采样的跨月问题。
完整实现代码:

import pandas as pd

# 1. 预处理:将DATE列转为datetime格式
df['DATE'] = pd.to_datetime(df['DATE'])

# 2. 生成分组标签:根据日期的日字段判断所属分段
def tag_period(date_val):
    day = date_val.day
    if day <= 10:
        seg = 1
    elif day <=20:
        seg =2
    else:
        seg =3
    # 标签格式为 年-月-分段号,保证同属一个月同一分段的数据标签一致
    return f"{date_val.year}-{date_val.month:02d}-S{seg}"

df['seg_tag'] = df['DATE'].apply(tag_period)

# 3. 分组聚合:按证券代码、分段标签分组,计算PP总和,同时取分段内最早日期作为输出的DATE值
result = df.groupby(by=['CODE', 'seg_tag'], as_index=False).agg(
    PP=('PP', 'sum'),
    DATE=('DATE', 'min')
)

# 4. 整理输出格式:调整列顺序、按日期排序、处理小数精度
result = result[['CODE', 'DATE', 'PP']].sort_values(by='DATE').reset_index(drop=True)
result['PP'] = result['PP'].round(1)

效果验证

用给出的1月样本数据测试:

  • 1月1-10日PP总和为39.5,和预期一致
  • 1月11-20日PP总和为36,和预期一致
  • 1月21-31日PP总和为39,和预期一致
    该方案会自动识别每个月的总天数,第三段会自动覆盖21日到当月月末的所有数据,完全适配28/29/30/31天的月份,不会出现跨月分段的问题。

内容的提问来源于stack exchange,提问作者Javier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:51:22