代码之家  ›  专栏  ›  技术社区  ›  Tim

np.vectorize和relativelta返回“relativeltaonlydiffs datetime/date”

  •  1
  • Tim  · 技术社区  · 2 年前

    我有一个pandas数据帧,它有两个datetime64[ns]列(“d1”和“d2”)表示日期。我想创建第三列,计算这两个日期之间的差异。我不能使用简单的365天计算,所以我需要relativelta。

    在一行中使用relativelta效果良好:

    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循环?

    1 回复  |  直到 2 年前
        1
  •  0
  •   jezrael    2 年前

    使用列表理解:

    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)