You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python的Pandas中为日期添加小数年份生成新日期?

解决Pandas中小数年份与日期相加的问题

你遇到的问题很常见——datetime.timedelta确实不支持直接传入years参数(毕竟不同年份天数不同),而且它只能处理标量值,没法直接和Pandas的Series配合使用。下面给你两种可行的方法,都能得到接近的目标日期:

方法1:使用pd.DateOffset处理日历年份

Pandas的DateOffset专门用来处理日历相关的时间偏移,它支持传入小数年份,还能通过逐行处理和Series配合使用:

import pandas as pd

# 初始化你的DataFrame
df = pd.DataFrame({
    'date': ['2009-12-25','2005-01-09','2010-10-31'],
    'time_in_years': ['10.3434','5.0977','3.3426']
})
df['date'] = pd.to_datetime(df['date'])
df["time_in_years"] = df.time_in_years.astype(float)

# 生成date_2列
df['date_2'] = df.apply(lambda row: row['date'] + pd.DateOffset(years=row['time_in_years']), axis=1)

这个方法会按照日历规则处理年份、月份的变化,比如遇到闰年2月29日这类特殊日期时,会自动调整到合理的日期,小数年份的部分会按比例分配到月和日,结果更符合日常的日历逻辑。

方法2:通过平均年天数转换为时间差

如果你不需要严格遵循日历规则,只是想要一个近似的时间跨度,可以把小数年份转换成天数(用公历平均年长度365.2425天),再用pd.to_timedelta转换为时间差:

# 使用平均年天数计算
avg_days_per_year = 365.2425
df['date_2'] = df['date'] + pd.to_timedelta(df['time_in_years'] * avg_days_per_year, unit='D')

这种方法计算更快,不需要逐行apply,适合处理大规模数据,但结果是基于平均天数的近似值,和日历年份的精确计算会有细微差别。

为什么你的原代码不行?

  • datetime.timedelta没有years参数,因为年份的天数不固定(平年365,闰年366),Python标准库的timedelta只支持固定时长的单位(天、小时、秒等)。
  • 即使你转换为天数,datetime.timedelta也只能接受标量值,不能直接传入Pandas的Series,所以会报错。

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

火山引擎 最新活动