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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:10:07