【问题标题】:Calculate state duration with pandas用 pandas 计算状态持续时间
【发布时间】: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:002021-03-01 01:30:00 之间的 True 持续时间 - 它在 2021 年 2 月 1 日聚合为 1 小时,在 2021 年 3 月 1 日聚合为 1.5 小时)。

如果有人对必须通过pandas 实现这一点有任何建议,我将不胜感激。

【问题讨论】:

    标签: python pandas numpy scipy influxdb


    【解决方案1】:

    IIUC,你可以试试:

    1. 转换为datetime
    2. 使用pivot_table重构dataframe
    3. fill particular day 的缺失值与合适的 values
    4. 计算difference
    5. 使用asfreq('1D') 填写missing days
    6. 0填充NAN
    df.datetime = pd.to_datetime(df.datetime, format='%Y-%d-%m %H:%M:%S')
    df1 = df.pivot_table(index=[df.datetime.dt.date],
                         columns='state', values='datetime', aggfunc='first')
    df1[True] = df1[True].fillna(pd.to_datetime(df1.index.to_series()))
    df1[False] = df1[False].fillna(pd.to_datetime(
        df1.index.to_series()) + pd.DateOffset(+1))
    result = (df1[False] - df1[True]).asfreq('1D').fillna(pd.Timedelta(seconds=0))
    

    输出:

    datetime
    2021-01-01   0 days 04:30:00
    2021-01-02   0 days 01:00:00
    2021-01-03   0 days 01:30:00
    2021-01-04   0 days 00:00:00
    2021-01-05   0 days 18:00:00
    Freq: D, dtype: timedelta64[ns]
    

    【讨论】:

    • 感谢您的回复,这适用于给定的示例,但是我必须更新 pandas 才能工作,我有 0.19.x 并且它不起作用,将其升级到 0.20.3似乎正在工作,但我宁愿避免使用它,因为很多代码都在使用当前版本,而且没有很多代码经过测试。此外,如果我有更多“密集”数据点,我正在尝试找出要更改的部分。例如,我每分钟有几个点,我希望结果显示每 1 分钟间隔的持续时间(以秒为单位)。
    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    相关资源
    最近更新 更多