计算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
相关产品推荐
相关产品推荐

