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

如何为DataFrame重复行逐年递增生成new_date列?

解决方案:给重复行生成逐年递增的1月1日日期

你的核心需求是按id分组(因为同一id对应的date完全相同),给组内的每一行分配一个递增的年份——从原日期的年份开始,每多一行加一年,最终生成对应年份的1月1日。

之前的代码只处理了唯一日期的转换,但没有区分组内的重复行,所以所有重复行都拿到了同一个日期。下面是完整的实现步骤:

步骤1:重现初始DataFrame

先确认我们的初始数据一致:

import pandas as pd
import datetime

df_array = {"date":["2016/11/4", "2016/11/4", "2016/11/4" , "2014/3/2", "2015/5/6", "2015/5/6"], "id":["1", "1", "1" , "2", "3", "3"]}
df = pd.DataFrame(df_array)
df["date"] = pd.to_datetime(df["date"])

步骤2:给每组内的行添加序号

使用groupby().cumcount()可以给每个id组内的行从0开始生成连续序号,这个序号就是我们需要额外增加的年数:

df['group_row_num'] = df.groupby('id').cumcount()

步骤3:生成new_date列

这里提供两种高效的实现方式:

方法1:使用pd.to_datetime年份格式化(推荐,矢量化更高效)

直接将原年份加上组内序号,再用pd.to_datetime自动转换为当年1月1日:

df['new_date'] = pd.to_datetime(df['date'].dt.year + df['group_row_num'], format='%Y')

方法2:用datetime构造函数(逻辑更直观)

如果需要更清晰的构造逻辑,可以用apply逐行处理:

df['new_date'] = df.apply(
    lambda row: datetime.datetime(row['date'].year + row['group_row_num'], 1, 1),
    axis=1
)

步骤4:清理临时列(可选)

如果不需要group_row_num这个临时辅助列,可以删除它:

df = df.drop('group_row_num', axis=1)

最终结果

执行完上述代码后,你的DataFrame会变成:

iddatenew_date
12016-11-042016-01-01
12016-11-042017-01-01
12016-11-042018-01-01
22014-03-022014-01-01
32015-05-062015-01-01
32015-05-062016-01-01

为什么之前的方法无效?

你之前用df.drop_duplicates()["date"].dt.year.apply(...)只提取了唯一的日期值,然后赋值回整个DataFrame,导致同一id下的所有重复行都共享同一个转换后的日期,没有区分组内的行顺序和数量。而通过groupby().cumcount()我们可以精准追踪每组内的行位置,从而实现年份的递增。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:39:20