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
相关产品推荐
相关产品推荐

