Pandas从timeseries列中获取日期范围



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

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

到目前为止,我只能考虑对因子进行分组,然后进行最小和最大操作,但这不适用于因子1

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

如何实现输出?

cumsum比较factor的移位,找到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

最新更新