微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用熊猫计算状态持续时间

如何解决使用熊猫计算状态持续时间

我有以下 pandas 数据框,表示打开某个信号时的一些时间序列数据(True 状态):

日期时间 状态
2021-01-01 01:00:00 真的
2021-01-01 04:00:00 真的
2021-01-01 05:30:00 错误
2021-02-01 23:00:00 真的
2021-03-01 01:30:00 错误
2021-05-10 06:00:00 真的

我需要计算信号每天处于 True 状态的时间,如下表所示。

日期时间 持续时间(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],'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 获取与持续时间相对应的绘图下方的区域。还尝试了一些方法获取连续点之间的时间增量并在那里做一些累积总和,但再次没有运气。

我认为主要问题是按天分组(注意 True2021-02-01 23:00:00间的 2021-03-01 01:30:00 持续时间 - 它在 2021-02-01 和 2021 年合计为 1 小时和 1.5 小时-03-01).

如果有人对使用 pandas 实现这一目标有任何建议,我将不胜感激。

解决方法

IIUC,你可以试试:

  1. 转换为 datetime
  2. 使用 pivot_table 重构 dataframe
  3. fill 具有合适 particular dayvalues 的缺失值。
  4. 计算 difference
  5. 使用 asfreq('1D') 填充 missing days
  6. NAN 填充 0
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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。