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]})
如何实现输出?
使用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
我有一个看起来像这样的数据框:
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]})
如何实现输出?
使用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