获取连续期间的第一个和最后一个之后的日期 pandas

Get first and date after last of continuous period pandas

数据帧样本df我有:

    date_code   item_code   vstore_code
1   2022-03-26  11111       N01
2   2022-03-27  11111       N01
3   2022-03-28  11111       N01
4   2022-03-29  11111       N01
5   2022-03-30  11111       N01
6   2022-03-31  11111       N01
7   2022-04-01  11111       N01
8   2022-04-08  11111       N01
9   2022-04-15  11111       N01
10  2022-04-17  11111       N01
11  2022-04-18  11111       N01
12  2022-04-19  11111       N01
13  2022-04-21  11111       N01
14  2022-04-22  11111       N01
15  2022-04-26  11111       N01
16  2022-02-01  22222       N02
17  2022-02-02  22222       N02
18  2022-02-03  22222       N02
19  2022-02-10  22222       N02

有很多物品和商店。

我想创建单独的数据框,其中包含每个 store 的每个 item 每个连续周期的开始和结束+1 的记录。

预期输出:

item_code   store_code   start_period   end_period
11111       N01          2022-03-26     2022-04-02
11111       N01          2022-04-08     2022-04-09
11111       N01          2022-04-15     2022-04-16
11111       N01          2022-04-17     2022-04-20
11111       N01          2022-04-21     2022-04-23
11111       N01          2022-04-26     2022-04-27
22222       N02          2022-02-01     2022-02-04
22222       N02          2022-02-10     2022-02-11

您可以按连续日期时间聚合,比较差异 Series.diff for not equal 1 day with Series.cumsum 并传递给 groupby 聚合 minmax,最后添加 1 day end_period 列:

df['date_code'] = pd.to_datetime(df['date_code'])
g = df['date_code'].diff().dt.days.ne(1).cumsum()

df = (df.groupby(['item_code','vstore_code',g])
        .agg(start_period=('date_code','min'), 
             end_period=('date_code','max'))
        .droplevel(-1)
        .reset_index()
        .assign(end_period = lambda x: x['end_period'] + pd.Timedelta('1 day'))
        )
print (df)

0      11111         N01   2022-03-26 2022-04-02
1      11111         N01   2022-04-08 2022-04-09
2      11111         N01   2022-04-15 2022-04-16
3      11111         N01   2022-04-17 2022-04-20
4      11111         N01   2022-04-21 2022-04-23
5      11111         N01   2022-04-26 2022-04-27
6      22222         N02   2022-02-01 2022-02-04
7      22222         N02   2022-02-10 2022-02-11