计算一列在恢复为 0 之前为正的时间量

问题描述

我有一个包含日期时间索引的非负值的表,如下所示:

                    CapturableSeparation
date    
2021-02-23 18:09:00 0.00
2021-02-23 18:10:00 0.00
2021-02-23 18:11:00 0.04
2021-02-23 18:12:00 0.04
2021-02-23 18:13:00 0.00
... ...
2021-02-25 23:56:00 0.00
2021-02-25 23:57:00 0.91
2021-02-25 23:58:00 0.74
2021-02-25 23:59:00 0.55

我想创建一个非连续 0 之间的时间量表(正值在恢复为 0 之前持续的时间量),以这些连续正值期间“CapturableSeparation”的平均值为键。对于可见的数据,表格可能如下所示:

                    AvgValue
persistence 
00:02:00            0.04
00:03:00            0.73

其中第一行对应于持续 2 分钟的 Dataframe 开头的正值,第二行对应于持续 3 分钟的末尾。

这应该怎么做?

解决方法

这是通过使用布尔掩码和 cumsum 识别连续的非零值块来解决问题的一种方法:

m = df['CapturableSeparation'].eq(0)
b = m.cumsum()[~m]
agg_dict = {'persistence': ('date',np.ptp),'avgvalue'   : ('CapturableSeparation','mean')}

out = df.groupby(b,as_index=False).agg(**agg_dict)
out['persistence'] += pd.Timedelta(minutes=1)

详情:

CapturableSeparation 列与 0 进行比较以创建布尔掩码:

>>> m

0     True
1     True
2    False
3    False
4     True
5     True
6    False
7    False
8    False
Name: CapturableSeparation,dtype: bool

然后在上面的布尔掩码上使用 cumsum 来识别连续非零值的块:

>>> b

2    2
3    2
6    4
7    4
8    4
Name: CapturableSeparation,dtype: int64

对这些连续块上的数据框进行分组,并使用 np.ptp 聚合列 date,使用 CapturableSeparation 聚合列 mean

>>> out

      persistence  avgvalue
0 0 days 00:02:00  0.040000
1 0 days 00:03:00  0.733333