基于日期条件实现Pandas列自动递增的问题求助
解决方案
原代码的核心问题是:使用cumsum()完成累加后再修改重置点的值,无法调整后续行的累加结果——因为cumsum()已经提前计算了所有行的累计值,单个值的修改不会回溯影响后续数据。
要实现需求,关键是按重置点划分独立分组,在每个分组内单独计算递增序列,具体实现如下:
完整代码
import pandas as pd import numpy as np # 初始化数据并转换日期类型(原代码缺失此步骤,直接用dt属性会报错) df = pd.DataFrame({'Date': ['2020-02-29', '2020-03-01', '2020-10-01', '2020-10-02', '2020-10-03', '2020-10-04', '2021-10-01', '2021-10-02', '2021-10-03', '2021-10-04']}) df['Date'] = pd.to_datetime(df['Date']) # 标记所有重置点:2020年2月29日,以及每年10月1日 reset_points = (df['Date'] == '2020-02-29') | ((df['Date'].dt.day == 1) & (df['Date'].dt.month == 10)) # 生成分组标识:每遇到一个重置点,开启一个新分组 df['group'] = reset_points.cumsum() # 为每个分组计算递增序列 def get_sequence(group): # 生成组内从1开始的基础递增序列 base_seq = np.arange(1, len(group)+1) # 针对2020-02-29的特殊分组,将起始值调整为151 if group.iloc[0]['Date'] == '2020-02-29': return base_seq + 150 # 1+150=151,2+150=152,以此类推 return base_seq # 应用分组计算并展开结果 df['Oct_year_day'] = df.groupby('group').apply(get_sequence).explode().astype(float) # 可选:删除临时分组列 df = df.drop('group', axis=1) print(df)
运行结果
Date Oct_year_day 0 2020-02-29 151.0 1 2020-03-01 152.0 2 2020-10-01 1.0 3 2020-10-02 2.0 4 2020-10-03 3.0 5 2020-10-04 4.0 6 2021-10-01 1.0 7 2021-10-02 2.0 8 2021-10-03 3.0 9 2021-10-04 4.0
关键步骤说明
- 日期类型转换:必须先将
Date列转为datetime类型,才能使用dt属性提取日/月信息 - 重置点标记:通过布尔条件筛选出所有需要重置序列的日期,包括特殊的2020-02-29和每年的10月1日
- 分组生成:用
cumsum()对重置点布尔值累加,每遇到一个重置点,分组号自动+1,实现按重置区间划分独立组 - 组内序列计算:每个分组生成从1开始的基础序列,针对2020-02-29的分组,通过加150调整起始值为151,确保后续逐日递增
内容的提问来源于stack exchange,提问作者Shane S
相关产品推荐
相关产品推荐

