如何解决使用熊猫计算状态持续时间
我有以下 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
获取与持续时间相对应的绘图下方的区域。还尝试了一些方法来获取连续点之间的时间增量并在那里做一些累积总和,但再次没有运气。
我认为主要问题是按天分组(注意 True
和 2021-02-01 23:00:00
之间的 2021-03-01 01:30:00
持续时间 - 它在 2021-02-01 和 2021 年合计为 1 小时和 1.5 小时-03-01).
如果有人对使用 pandas
实现这一目标有任何建议,我将不胜感激。
解决方法
IIUC,你可以试试:
- 转换为
datetime
。 - 使用
pivot_table
重构dataframe
。 -
fill
具有合适particular day
的values
的缺失值。 - 计算
difference
。 - 使用
asfreq('1D'
) 填充missing days
。 - 用
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 举报,一经查实,本站将立刻删除。