我有一个 pandas 数据框,其中有两个代表日期的 datetime64[ns] 列(“d1”和“d2”)。我想创建第三列,计算这两个日期之间的差异。我无法使用简单的 days/365 样式计算,因此我需要relativedelta。
使用relativedelta 在一行上效果很好:
import dateutil.relativedelta as relativedelta
relativedelta.relativedelta(df["d1"][0],df["d2"][0])
> relativedelta(years=+1)
但是它在列上失败了。所以我将它矢量化:
date_diffs=np.vectorize(relativedelta.relativedelta)
然后我尝试
date_diffs(df["d1"],df["d2"])
但是这会返回
TypeError: relativedelta only diffs datetime/date
我该如何解决这个问题?或者我应该简单地使用
apply
语句或 for 循环?
使用列表理解:
df = pd.DataFrame({'d1':pd.date_range('2000-01-05', periods=3),
'd2':pd.date_range('2006-08-05', periods=3, freq='35M')})
from dateutil.relativedelta import relativedelta
def date_diffs(s, e):
return relativedelta(s,e)
df['out'] = [date_diffs(s, e) for s, e in zip(df["d1"],df["d2"])]
print(df)
d1 d2 out
0 2000-01-05 2006-08-31 relativedelta(years=-6, months=-7, days=-26)
1 2000-01-06 2009-07-31 relativedelta(years=-9, months=-6, days=-25)
2 2000-01-07 2012-06-30 relativedelta(years=-12, months=-5, days=-23)
如果使用
apply
,它应该会更慢:
df['out'] = df.apply(lambda x: date_diffs(x["d1"],x["d2"]) , axis=1)