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

