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

Python pandas日期列与指定变量日期差值计算报错求解

报错原因

relativedelta 仅支持对单个日期对象做差值计算,你直接传入pandas整列(Series)作为参数时,函数内部的条件判断逻辑无法对一整组数据返回唯一布尔值,因此触发The truth value of a Series is ambiguous报错。

解决方案

方案1:逐行调用relativedelta(小数据量适用,和你原有逻辑完全匹配)

先确保日期列和你定义的enddate类型对齐,再用apply逐行计算年差:

import pandas as pd
from datetime import date
from dateutil.relativedelta import relativedelta

enddate = date(2021, 10, 15)
# 把maturity列转为date类型,和enddate类型匹配
metric_df['maturity'] = pd.to_datetime(metric_df['maturity']).dt.date
# 逐行计算年差值
metric_df['term'] = metric_df['maturity'].apply(lambda x: relativedelta(x, enddate).years)

方案2:矢量化运算(大数据量适用,运算效率远高于逐行调用)

直接用pandas内置的日期属性计算,结果和relativedelta.years完全一致:

import pandas as pd
from datetime import date

enddate = date(2021, 10, 15)
enddate_pd = pd.to_datetime(enddate)
# 把maturity列转为pandas datetime类型
metric_df['maturity'] = pd.to_datetime(metric_df['maturity'])

# 先算年份差
year_gap = metric_df['maturity'].dt.year - enddate_pd.year
# 判断maturity的月日是否早于enddate的月日,是则年份差减1
adjust = (
    (metric_df['maturity'].dt.month < enddate_pd.month)
    | ((metric_df['maturity'].dt.month == enddate_pd.month) & (metric_df['maturity'].dt.day < enddate_pd.day))
)
metric_df['term'] = year_gap - adjust.astype(int)

注:如果需要取绝对值的年差,在计算结果外层加abs()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:54:04