Python实现每月初重置累计计数至零的技术求助
解决方案
核心思路
要实现每月初重置累计计数,需按月份分组计算累计差值,而非全局累计。先将日期转为可分组的年月周期,再在每个月内单独计算X-Y的累计值,最后套用原公式生成结果。
代码实现
import pandas as pd # 确保Date列为datetime类型(若未转换) df1['Date'] = pd.to_datetime(df1['Date']) # 按年月分组,计算组内(X-Y)的累计值并移位填充 cum_diff = df1.groupby(df1['Date'].dt.to_period('M')).apply( lambda group: (group['X'] - group['Y']).cumsum().shift(1).fillna(0) ).reset_index(level=0, drop=True) # 生成最终DataFrame df_final = df1.copy() df_final['X'] = df_final['X'] + cum_diff
结果验证
运行后df_final将完全匹配目标输出:
| Date | X | Y |
|---|---|---|
| 2021-04-25 | 4 | 4 |
| 2021-04-26 | 0 | 0 |
| 2021-04-27 | 0 | 0 |
| 2021-04-28 | 56 | 53 |
| 2021-04-29 | 3 | 0 |
| 2021-04-30 | 4 | 0 |
| 2021-05-01 | 0 | 0 |
| 2021-05-02 | 5 | 0 |
| 2021-05-03 | 10 | 5 |
| 2021-05-04 | 5 | 0 |
关键说明
dt.to_period('M'):将日期转换为年月周期,确保同一月份的数据被分到同一组,实现每月重置。groupby.apply(...):在每个月组内单独计算累计差值,避免跨月份的累计传递。shift(1).fillna(0):将前一天的累计值移到当前行,每月第一天的累计值填充为0,符合月初重置的要求。
内容的提问来源于stack exchange,提问作者user17582908
相关产品推荐
相关产品推荐

