Python中relativedelta与datetime库日期计算的异常问题咨询
分四次加3个月与一次性加12个月结果不同的原因
核心差异来自dateutil.relativedelta对月末日期的调整逻辑:当原日期是当月最后一天,而目标月份没有对应天数时,relativedelta会自动将日期修正为目标月份的最后一天,多次叠加后会产生累积偏差。
分步计算过程拆解
初始日期:2020-07-31
- 第一次加3个月:
2020-07-31→2020-10-31(10月有31天,无调整) - 第二次加3个月:
2020-10-31→2021-01-31(1月有31天,无调整) - 第三次加3个月:
2021-01-31→2021-04-30(4月只有30天,自动调整为月末) - 第四次加3个月:
2021-04-30→2021-07-30(从4月30日加3个月,直接对应7月30日,无月末修正触发)
而一次性加12个月时,relativedelta会直接校验目标年份的对应月份:2021年7月有31天,因此直接返回2021-07-31,没有中间步骤的调整偏差。
解决方法
如果需要每次加3个月都保留月末属性,可以通过强制指定day=31来确保结果始终是当月最后一天:
import datetime as dt import dateutil.relativedelta as rd d = dt.date(2020, 7, 31) for _ in range(4): d += rd.relativedelta(months=+3, day=31) print(d) # 输出 2021-07-31 # 或直接使用一次性加12个月的方式(业务逻辑允许的情况下) print(dt.date(2020, 7, 31) + rd.relativedelta(months=+12)) # 输出 2021-07-31
内容的提问来源于stack exchange,提问作者Gustav
相关产品推荐
相关产品推荐

