【问题标题】:Calculate the amount of time that a column was positive before reverting to 0计算一列在恢复为 0 之前为正的时间量
【发布时间】:2021-03-11 17:57:40
【问题描述】:

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

                    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

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

这应该怎么做?

【问题讨论】:

  • 到目前为止您尝试过什么?你哪里失败了?
  • @Manakin 我最初尝试创建一个表,其中仅包含包含正值的行,然后计算观测值之间的时间差。这导致了上一个连续积极和下一个第一个之间的太多飞跃,我一直在努力想出一个概念上合理的解决方案,而不仅仅是蛮力解决问题。我基本上可以按照我刚才所说的去做,并消除一个多小时内的所有时间差异,但这会阻碍代码对新数据的使用

标签: python pandas datetime datetimeindex


【解决方案1】:

这是通过使用布尔掩码和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,使用mean 聚合列CapturableSeparation

>>> out

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

【讨论】:

  • 当运行“out = df.groupby(b, as_index=False).agg(**agg_dict)”行时,我得到一个 KeyError 说“列‘日期’不存在”。这是因为我的日期列是日期时间索引吗?
  • 是的,你需要reset index 在使用上面的代码之前。检查df = df.reset_index()
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多