python - 计算某列在恢复为 0 之前为正值的时间量

标签 python pandas datetime datetimeindex

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

                    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/

相关文章:

python - Keras 期望 dense_13 具有 2 个维度

python - 如何在 wxpython 中使用 Matplotlib.animation?

python - 将列中的数据相乘python

python - 在 GCP 上使用 python numpy 和 pandas 部署小批量作业

Perl:给定年份和周数,我如何获得该周的第一个日期?

python - 使用 Scikit-Learn GridSearchCV 与 PredefinedSplit 进行交叉验证 - 交叉验证结果非常好

python - 有没有办法将 gcloud 与 python3 一起使用?

python - 选择 pandas dframe 中的行,其中给定的输入列表是 dframe 列中列表的子集

c# - 像 StackoverFlow 一样设置日期时间格式

java - 从 Notes DateTime 对象设置 Java 日期对象