如何基于pandas DataFrame列值计算行时间差并统计总故障时长
Pandas 故障时长计算实现代码
首先明确计算逻辑:
- 以
Passing事件作为序列划分标识,每遇到一次Passing即开启一个新的故障统计序列 - 每个序列内取首个
Passing的时间,减去该序列内最早的Failing时间,得到单段Downtime - 所有单段Downtime求和得到Total Downtime
完整可运行代码如下:
import pandas as pd # 原始数据 data = { 'Status': ['Passing','Failing','Failing','Failing','Passing','Failing','Failing','Failing'], 'TimeStamp': ['2021-11-25 15:15:36','2021-11-25 00:46:23','2021-11-25 00:16:03','2021-11-24 23:45:08','2021-11-25 15:15:13','2021-11-25 00:46:47','2021-11-25 00:16:09','2021-11-24 23:44:59'] } df = pd.DataFrame(data) # 1. 转换时间列为datetime格式,方便计算时间差 df['TimeStamp'] = pd.to_datetime(df['TimeStamp']) # 2. 划分统计序列:每遇到Passing就生成新的序列ID df['group_id'] = (df['Status'] == 'Passing').cumsum() # 3. 按序列分组计算单段故障时长 def calc_downtime(group): # 取当前组首个Passing的时间 pass_time = group[group['Status'] == 'Passing']['TimeStamp'].iloc[0] # 取当前组最早的Failing时间 fail_time = group[group['Status'] == 'Failing']['TimeStamp'].min() # 计算时间差,这里返回秒为单位,也可根据需要转成小时/天等 group['SingleDowntime'] = (pass_time - fail_time).total_seconds() return group df = df.groupby('group_id', group_keys=False).apply(calc_downtime) # 4. 计算总故障时长,所有行统一赋值总和 df['TotalDowntime'] = df['SingleDowntime'].unique().sum() # 可选:删除辅助列group_id df = df.drop(columns='group_id') print(df)
输出说明
上述代码运行后,SingleDowntime列会存储对应序列的单段故障时长(单位为秒),TotalDowntime列存储所有序列故障时长总和。如果需要调整时间差单位,可修改total_seconds()为total_seconds()/3600得到小时单位,除以86400得到天单位。
内容的提问来源于stack exchange,提问作者jmin
相关产品推荐
相关产品推荐

