我有一个包含针对日期时间索引的非负值的表,如下所示:
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 分钟的正值,第二行对应于数据帧末尾持续 3 分钟的正值。
这应该如何完成?
最佳答案
这是解决该问题的一种方法,即使用 bool 掩码和cumsum
来识别连续的非零值 block :
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
进行比较以创建 bool 掩码:
>>> m
0 True
1 True
2 False
3 False
4 True
5 True
6 False
7 False
8 False
Name: CapturableSeparation, dtype: bool
然后使用 cumsum
在上面的 bool 掩码上识别连续非零值的 block :
>>> b
2 2
3 2
6 4
7 4
8 4
Name: CapturableSeparation, dtype: int64
对这些连续 block 上的数据帧进行分组,并使用 np.ptp
聚合列date
和列 CapturableSeparation
使用 mean
:
>>> out
persistence avgvalue
0 0 days 00:02:00 0.040000
1 0 days 00:03:00 0.733333
关于python - 计算某列在恢复为 0 之前为正值的时间量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66587962/