我有一个 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 中获得所需的输出?
用途:
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
您可以计算两个日期之间的周期数并将其保持在您的限制范围内:
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