根据条件时间范围过滤每个 ID 的数据帧

Filter dataframe per ID based on conditional timerange

您好,我会尝试解释我面临的问题。

我有一个数据框 (df) 包含以下内容:

ID Date (dd-mm-yyyy)
AAA 01-09-2020
AAA 01-11-2020
AAA 18-03-2021
AAA 10-10-2022
BBB 01-01-2019
BBB 01-03-2019
CCC 01-05-2020
CCC 01-07-2020
CCC 01-08-2020
CCC 01-10-2021

我创建了另一个数据框 (df2),每个 ID 注册的第一个日期 (t) 和 t+3 个月:

ID T (First Date Occurred) T+3
AAA 01-09-2020 01-12-2020
BBB 01-01-2019 01-03-2020
CCC 01-05-2020 01-08-2020

我苦苦挣扎的期望输出是根据 df2("T​​" & "T+3):

中定义的两个日期过滤器过滤 df

e.g.AAA = AAA > T & AAA < T+3

ID Date (dd-mm-yyyy)
AAA 01-11-2020
BBB 01-03-2019
CCC 01-07-2020
CCC 01-08-2020

解决这个问题的最佳方法是什么?感谢您的帮助!

IIUC,你可以使用 pandas.merge_asofallow_exact_matches=False:

(pd.merge_asof(df1.sort_values(by='Date'), df2.sort_values(by='T'),
               allow_exact_matches=False,
               by='ID', left_on='Date', right_on='T')
   .loc[lambda d: d['Date'] <= d['T+3']]
)

注意。 T+3 的确切条件不清楚,因为你描述了“< T+3”,但显示的输出有“<= T+3”,只需在 loc 中选择你想要的(< 或 <=)

输出:

    ID       Date          T        T+3
1  BBB 2019-03-01 2019-01-01 2020-03-01
3  CCC 2020-07-01 2020-05-01 2020-08-01
4  CCC 2020-08-01 2020-05-01 2020-08-01
6  AAA 2020-11-01 2020-09-01 2020-12-01