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

计算DataFrame中datetime64[ns]日期间隔月数时遇TypeError错误

问题原因及解决方法

错误原因

pd.Timedelta不支持传入months作为参数——因为每个月的天数不固定(28-31天不等),pandas不允许用Timedelta表示这种可变时长的间隔。你传入months=1时,内部参数处理逻辑出错,触发了str与int无法比较的类型错误。即便你的两个字段确实是datetime64[ns]类型,这个写法本身也不成立,和数据类型无关。

解决方法

根据你需要的精度,有两种常用方案:

1. 计算精确整月数(无小数)

直接通过年份差和月份差计算,得到两个日期之间的完整月份数:

# 验证字段类型(可选)
print(df_hist[['Last_Date', 'Begin_Time']].dtypes)

# 若字段不是datetime类型,先转换
df_hist['Last_Date'] = pd.to_datetime(df_hist['Last_Date'])
df_hist['Begin_Time'] = pd.to_datetime(df_hist['Begin_Time'])

# 计算整月数
df_hist['MonthsBetween'] = (df_hist['Last_Date'].dt.year - df_hist['Begin_Time'].dt.year) * 12 + (df_hist['Last_Date'].dt.month - df_hist['Begin_Time'].dt.month)

2. 计算带小数的近似月数(考虑天数占比)

如果需要更精细的结果(比如包含部分月份的占比),可以用以下两种方式:

方案A:用平均天数换算

df_hist['DaysBetween'] = (df_hist['Last_Date'] - df_hist['Begin_Time']).dt.days
# 按一年365.25天计算平均每月天数30.4375
df_hist['MonthsBetween'] = df_hist['DaysBetween'] / 30.4375

方案B:用relativedelta精确计算

先安装依赖:pip install python-dateutil

from dateutil.relativedelta import relativedelta

def calc_month_diff(row):
    delta = relativedelta(row['Last_Date'], row['Begin_Time'])
    return delta.years * 12 + delta.months + delta.days / 30.4375

df_hist['MonthsBetween'] = df_hist.apply(calc_month_diff, axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:50:25