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

基于日期条件实现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

关键步骤说明

  1. 日期类型转换:必须先将Date列转为datetime类型,才能使用dt属性提取日/月信息
  2. 重置点标记:通过布尔条件筛选出所有需要重置序列的日期,包括特殊的2020-02-29和每年的10月1日
  3. 分组生成:用cumsum()对重置点布尔值累加,每遇到一个重置点,分组号自动+1,实现按重置区间划分独立组
  4. 组内序列计算:每个分组生成从1开始的基础序列,针对2020-02-29的分组,通过加150调整起始值为151,确保后续逐日递增

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:42:52