如何使用Pandas将年数字段值添加到日期列生成新日期列
解决方案
错误原因说明
pd.to_timedelta不支持精准的年单位计算,受每年天数不固定影响,官方已弃用年/月单位的timedelta参数pd.offsets.DateOffset仅支持传入标量参数,直接传入Number_Years整列Series会运行失败- 按365天累加的方案会受闰年影响出现日期偏移,不符合仅修改年份的需求
可行方案
方案1:逐行处理(兼容闰年特殊日期,数据量不大时优先)
首先确保Date列为datetime类型,再逐行调用DateOffset计算:
import pandas as pd # 先转换Date列为标准 datetime 格式 df1['Date'] = pd.to_datetime(df1['Date']) # 逐行计算新日期 df1['New Date'] = df1.apply( lambda row: row['Date'] + pd.offsets.DateOffset(years=row['Number_Years']), axis=1 )
优势:遇到2月29日这类特殊日期时,会自动兼容非闰年场景,返回对应年份的2月28日,不会报错。
方案2:直接修改年份属性(需求严格对齐月日、无2月29日数据时使用)
直接替换datetime对象的year属性:
df1['Date'] = pd.to_datetime(df1['Date']) df1['New Date'] = df1.apply( lambda row: row['Date'].replace(year=row['Date'].year + row['Number_Years']), axis=1 )
注意:如果原始数据存在2月29日的日期,加年后对应年份不是闰年时会报错。
方案3:向量化计算(数据量较大时优先,性能远高于逐行apply)
直接提取日期的年、月、日属性,拼接为新日期:
df1['Date'] = pd.to_datetime(df1['Date']) df1['New Date'] = pd.to_datetime( { 'year': df1['Date'].dt.year + df1['Number_Years'], 'month': df1['Date'].dt.month, 'day': df1['Date'].dt.day }, errors='coerce' # 遇到非法日期(如非闰年2月29日)时返回NaT,可根据需求调整参数 )
内容的提问来源于stack exchange,提问作者user145248
相关产品推荐
相关产品推荐

