pandas np.vectorize和relativedelta返回“relativedelta only diffs datetime/date”

qc6wkl3g  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(44)

我有一个pandas框架,其中有两个datetime 64 [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循环?

jucafojl

jucafojl1#

使用列表理解:

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)

相关问题