首页 > 解决方案 > 通过两个数据帧之间的矢量化比较日期

问题描述

我有这个每周时间跨度的DataFrame df1

      Startdate             Enddate
0 2012-06-11 2012-06-17 23:59:59
1 2012-06-18 2012-06-24 23:59:59
2 2012-06-25 2012-07-01 23:59:59
3 2012-07-02 2012-07-08 23:59:59
4 2012-07-09 2012-07-15 23:59:59

我想找出我的其他数据框中的哪些日期在df2这个开始结束结束日期之间df1。之后,我想向 df2 添加一个新列,其中index匹配行中df1的 。

我的df2样子:

           FAID            VALID_TO          VALID_FROM
0  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45
1  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45
2  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45
3  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45
4  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45

所以可能最好简短地总结一下我的问题:如果df2['VALID_FROM']早于df1[startdate]但又年轻于df1[enddate],则在新列中写入df1[index](index = week number)

df2.loc[:,'NewColumn'] = df2.loc[:,'NewColumn'].mask(((df1.loc[:,'Startdate'] < df2.loc[:,'VALID_FROM']) & (df2.loc[:,'VALID_FROM'] < df1.loc[:,'Enddate'])),df1.loc[:,'index'])

但随后发生此错误:

ValueError: Can only compare identically-labeled Series objects

有什么想法可以对该操作进行矢量化吗?

我的预期输出将如下所示:

          FAID            VALID_TO          VALID_FROM                 Ind
0  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45 2
1  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45 7
2  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45 3
3  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45 14
4  41279041 2100-06-10 02:00:00 2010-03-05 10:02:45 25

解决了

df2['Date'] = pd.to_datetime(df2['VALID_FROM']) - pd.to_timedelta(7, unit='d')
df3 = df2.groupby([pd.Grouper(key="Date", freq="W-MON")])["Date","FAID"].count()

标签: pythonpandasdataframe

解决方案


    df2['Date'] = pd.to_datetime(df2['VALID_FROM']) - pd.to_timedelta(7, unit='d')
df3 = df2.groupby([pd.Grouper(key="Date", freq="W-MON")])["Date","FAID"].count()

这解决了我的问题


推荐阅读