Pandas 1.5.3与2.0.3日期算术运算结果差异咨询
Pandas 1.5.3与2.0.3日期月份差值计算差异原因
问题重现
你的代码在两个Pandas版本中输出结果存在明显差异:
- Pandas 1.5.3输出:
11.992 - Pandas 2.0.3输出:
11.774
示例代码:
import pandas as pd import numpy as np date1 = pd.to_datetime('2022-07-25') date2 = pd.to_datetime('2023-07-25') diff = (date2-date1)/np.timedelta64(1, 'M') print(diff)
差异核心原因
这个差异源于Pandas 2.0+调整了Timedelta与numpy timedelta64('M')的除法运算逻辑:
Pandas 1.5.x的处理逻辑
Pandas会自行处理该除法运算:将Timedelta的总天数除以平均每月天数(365.25/12≈30.4375天)。你的示例中两个日期差365天,计算为365 / 30.4375 ≈ 11.992,与输出结果一致。Pandas 2.0.x的处理逻辑
Pandas不再自行计算,而是将Timedelta转换为numpy的timedelta64[ns]对象,完全委托numpy执行除法。而numpy对timedelta64('M')的处理依赖其内部对“月”的近似定义,若你的环境中numpy将月近似为31天,就会得到365 / 31 ≈ 11.774的结果。
该变化属于Pandas底层与numpy交互逻辑的细节调整,未在官方发布说明中单独强调,因为它不属于公开API的变更,而是内部实现的优化。
更可靠的月份差值计算方式
由于“月”是可变长度的时间单位,用固定天数近似计算必然存在误差,推荐使用Pandas内置的日历月份差计算方法:
# 计算精准的日历月份差 diff_months = (date2.year - date1.year) * 12 + (date2.month - date1.month) print(diff_months) # 输出12,符合预期
内容的提问来源于stack exchange,提问作者gmartinez
相关产品推荐
相关产品推荐

