如何过滤相对于 Pandas 中的列值的时间窗口的日期?

问题描述 投票:0回答:2

我有一个 Pandas 数据框

df
,其中包含
ID
DATE
(同一六个月期间的连续年月日期)和
FIX_DATE
(每个
ID
的恒定年月日期)总是落在给定
DATE
周期的后半段)。多个
ID
具有相同的
DATE
周期。示例:

ID DATE    FIX_DATE

01 2023-01 2023-05
01 2023-02 2023-05
01 2023-03 2023-05
01 2023-04 2023-05
01 2023-05 2023-05
01 2023-06 2023-05
02 2023-01 2023-04
02 2023-02 2023-04
02 2023-03 2023-04
02 2023-04 2023-04
02 2023-05 2023-04
02 2023-06 2023-04

我需要一个查询,过滤出各个

ID
的行,其中行是每个
ID
的三个月长的记录,以每个用户的
FIX_DATE
日期结束。所以在我的例子中,结果是:

ID DATE    FIX_DATE

01 2023-03 2023-05
01 2023-04 2023-05
01 2023-05 2023-05
02 2023-02 2023-04
02 2023-03 2023-04
02 2023-04 2023-04

如何在 Pandas 中获得所需的输出?

python pandas subset
2个回答
0
投票

用途:

diff = pd.to_datetime(df['FIX_DATE']).dt.to_period('m').sub(pd.to_datetime(df['DATE']).dt.to_period('m'))
out = df[ diff.apply(lambda x: x.n).isin(range(3))]
print (out)
   ID     DATE FIX_DATE
2   1  2023-03  2023-05
3   1  2023-04  2023-05
4   1  2023-05  2023-05
7   2  2023-02  2023-04
8   2  2023-03  2023-04
9   2  2023-04  2023-04

或者:

df1 = df.iloc[::-1]
mask = df1['DATE'].eq(df1['FIX_DATE']).groupby(df1['ID']).cummax()

df1 = df1[mask]
out = df1[df1.groupby('ID').cumcount().lt(3)].iloc[::-1]
print (out)
   ID     DATE FIX_DATE
2   1  2023-03  2023-05
3   1  2023-04  2023-05
4   1  2023-05  2023-05
7   2  2023-02  2023-04
8   2  2023-03  2023-04
9   2  2023-04  2023-04

0
投票

您可以计算两个日期之间的周期数并将其保持在您的限制范围内:

N = 3

d = pd.to_datetime(df['DATE'], format='%Y-%m').dt.to_period('M')
f = pd.to_datetime(df['FIX_DATE'], format='%Y-%m').dt.to_period('M')

out = df[(f-d).map(lambda d: d.n).between(0, N-1)]

输出:

   ID     DATE FIX_DATE
2   1  2023-03  2023-05
3   1  2023-04  2023-05
4   1  2023-05  2023-05
7   2  2023-02  2023-04
8   2  2023-03  2023-04
9   2  2023-04  2023-04
© www.soinside.com 2019 - 2024. All rights reserved.