我有以下熊猫数据框:
Date Value
2019-01-01 0
2019-01-02 0
2019-01-03 0
2019-01-04 0
2019-01-05 1
2019-01-06 1
2019-01-10 1
2019-01-11 0
2019-01-12 0
2019-01-13 0
2019-01-14 0
我想要每组连续天数的开始日期和结束日期,其值等于 0,并获得如下所示的内容:
Start Date End Date. N Days
2019-01-01 2019-01-04 4
2019-01-11 2019-01-14 4
使用
cumsum
创建子组,然后使用 groupby
agg
创建子组
s = df.Value.ne(0).cumsum()
out = df[df.Value.eq(0)].groupby(s).Date.agg(['first','last','count'])
out
Out[295]:
first last count
Value
0 2019-01-01 2019-01-04 4
3 2019-01-11 2019-01-14 4
更新
s = (df.Value.ne(0) | df.Date.diff().dt.days.ne(1)).cumsum()
out = df[df.Value.eq(0)].groupby(s).Date.agg(['first','last','count'])
out
Out[306]:
first last count
1 2019-01-01 2019-01-04 4
4 2019-01-11 2019-01-14 4
5 2020-01-01 2020-01-01 1
输入数据
Date Value
0 2019-01-01 0
1 2019-01-02 0
2 2019-01-03 0
3 2019-01-04 0
4 2019-01-05 1
5 2019-01-06 1
6 2019-01-10 1
7 2019-01-11 0
8 2019-01-12 0
9 2019-01-13 0
10 2019-01-14 0
11 2020-01-01 0
“[BENY 的答案]部分有效,因为它没有考虑实际日期。事实上,如果我在末尾添加另一行 '2019-01-17' 且值为 0,则第二组的计数变成 5,但这不正确,因为“2019-01-14”和“2019-01-17”之间缺少一些天。”
可以通过以下方式解决:
t = df[df['Value'] == 0]['Date'].diff.dt.days
t = t.fillna(1.0)
t = t.ne(1.0).cumsum()
result = df.groupby(t)['Date'].agg(['first', 'last', 'count']