使用np.vectorize调用relativedelta报错,如何解决?是否改用apply/循环?
解决pandas中用relativedelta计算日期列差值的问题
你遇到的TypeError是因为np.vectorize传递给relativedelta的是numpy的datetime64[ns]类型对象,而relativedelta只接受Python原生的datetime.date或datetime.datetime对象。下面是几种可行的解决方式:
方法一:使用apply逐行处理
直接用apply遍历每一行,将列中的datetime64对象传入relativedelta:
import dateutil.relativedelta as relativedelta import pandas as pd # 假设df是你的目标DataFrame df['delta'] = df.apply(lambda row: relativedelta.relativedelta(row['d1'], row['d2']), axis=1)
axis=1指定按行处理,此时每一行的d1和d2会自动转为Python原生datetime对象,relativedelta可以正常计算。
方法二:先转原生datetime再用列表推导式
先把pandas的日期列转为Python原生datetime列表,再用列表推导式批量计算:
# 将datetime64列转为原生datetime对象列表 d1_py = df['d1'].dt.to_pydatetime() d2_py = df['d2'].dt.to_pydatetime() # 批量计算日期差值 df['delta'] = [relativedelta.relativedelta(a, b) for a, b in zip(d1_py, d2_py)]
这种方式避免了apply的额外封装开销,在数据量较大时性能略优。
方法三:提取具体差值分量(若不需要完整relativedelta对象)
如果只需要年、月、日这类具体的差值数值,可以基于relativedelta拆分提取:
def extract_date_diff(row): delta = relativedelta.relativedelta(row['d1'], row['d2']) return pd.Series([delta.years, delta.months, delta.days], index=['years', 'months', 'days']) # 生成多列差值结果 df[['years', 'months', 'days']] = df.apply(extract_date_diff, axis=1)
关于apply和for循环的选择
apply是封装后的循环,代码更简洁,适合快速实现需求;- 手动for循环和列表推导式逻辑更直观,数据量极小时差异不大,数据量大时列表推导式通常比
apply略快。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

