查找 pandas 中连续有多少天具有特定值

问题描述 投票:0回答:2

我有以下熊猫数据框:

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
python pandas datetime
2个回答
2
投票

使用

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

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']
© www.soinside.com 2019 - 2024. All rights reserved.