【发布时间】:2021-09-02 05:12:39
【问题描述】:
当某个信号打开时(True 状态),我有以下 pandas 数据帧表示一些时间序列数据:
| datetime | state |
|---|---|
| 2021-01-01 01:00:00 | True |
| 2021-01-01 04:00:00 | True |
| 2021-01-01 05:30:00 | False |
| 2021-02-01 23:00:00 | True |
| 2021-03-01 01:30:00 | False |
| 2021-05-10 06:00:00 | True |
如下表所示,我需要计算每天True 状态的信号持续了多长时间。
| datetime | duration(1h) |
|---|---|
| 01.01.2021 | 4.5 |
| 02.01.2021 | 1 |
| 03.01.2021 | 1.5 |
| 04.01.2021 | 0 |
| 05.01.2021 | 18 |
我尝试在database level using InfluxQL 上执行此操作,但没有结果,因此我决定改用 Python 执行此操作。
这是示例数据框:
import pandas as pd
d = {'state': [True, True, False, True, False, True], 'datetime': ['2021-01-01T01:00:00Z', '2021-01-01T04:00:00Z', '2021-01-01T05:30:00Z', '2021-01-02T23:00:00Z', '2021-01-03T01:30:00Z', '2021-01-05T06:00:00Z']}
df = pd.DataFrame(data=d)
df = df.set_index(pd.to_datetime(df['datetime'])) # set datetime as DatetimeIndex
我尝试了将布尔值转换为整数的选项,然后使用scipy.integrate 来获取与持续时间相对应的绘图下方区域。还尝试了一些方法来获取连续点之间的时间增量并在那里进行一些累积总和,但再次没有运气。
我认为主要问题是按天分组(注意2021-02-01 23:00:00 和 2021-03-01 01:30:00 之间的 True 持续时间 - 它在 2021 年 2 月 1 日聚合为 1 小时,在 2021 年 3 月 1 日聚合为 1.5 小时)。
如果有人对必须通过pandas 实现这一点有任何建议,我将不胜感激。
【问题讨论】:
标签: python pandas numpy scipy influxdb