Pandas 从时间序列列中获取日期范围

Pandas get date range from timeseries column

我有一个看起来像这样的数据框:

id  ts  factor
A   2020-01-01  1
A   2020-01-02  1
A   2020-01-03  1
A   2020-01-04  1
A   2020-01-05  1
A   2020-01-06  10
A   2020-01-07  10
A   2020-01-08  10
A   2020-01-09  10
A   2020-01-10  10
A   2020-01-11  10
A   2020-01-12  10
A   2020-01-13  10
A   2020-01-14  10
A   2020-01-15  10
A   2020-01-16  10
A   2020-01-17  10
A   2020-01-18  1
A   2020-01-19  1
A   2020-01-20  1

我想要的输出是:

id  start_ts    end_ts  factor
A   2020-01-01  2020-01-05  1
A   2020-01-06  2020-01-17  10
A   2020-01-18  2020-01-20  1

到目前为止我只能想到在factor上进行groupby然后做min和max操作,但这对factor 1不起作用

df.groupby(["factor"]).agg({'date' : [np.min, np.max]})

如何实现输出?

使用cumsumfactor的移位进行比较,找到factor块,然后将其添加到groupby:

blocks = df['factor'].ne(df['factor'].shift()).cumsum()
df.groupby(['id','factor',blocks], sort=False)['ts'].agg(['min','max'])

输出:

                         min         max
id factor factor                        
A  1      1       2020-01-01  2020-01-05
   10     2       2020-01-06  2020-01-17
   1      3       2020-01-18  2020-01-20

使用命名分组对@Quang Hoang 的略微更新变体:

blocks = df['factor'].ne(df['factor'].shift()).cumsum()
blocks = blocks.rename("group")

df2 = df.groupby(['id', blocks,'factor']).agg(
    start_ts=('ts', 'min'),
    end_ts=('ts', 'max'))\
    .reset_index()\
    .drop("group", axis=1)

输出:

print(df2)
  id  factor    start_ts      end_ts
0  A       1  2020-01-01  2020-01-05
1  A      10  2020-01-06  2020-01-17
2  A       1  2020-01-18  2020-01-20