Pandas:数据帧输出系统停机时间



我是Python的初学者。这些读数是从每隔20分钟向系统报告的传感器中提取的。现在,我想找出从开始时间到结束时间恢复的总停机时间。

原始数据:

date,           Quality Sensor Reading
1/1/2022 9:00   0
1/1/2022 9:20   0
1/1/2022 9:40   0
1/1/2022 10:00  0
1/1/2022 10:20  0
1/1/2022 10:40  0
1/1/2022 12:40  0
1/1/2022 13:00  0
1/1/2022 13:20  0
1/3/2022 1:20   0
1/3/2022 1:40   0
1/3/2022 2:00   0
1/4/2022 14:40  0
1/4/2022 15:00  0
1/4/2022 15:20  0
1/4/2022 17:20  0
1/4/2022 17:40  0
1/4/2022 18:00  0
1/4/2022 18:20  0
1/4/2022 18:40  0

预期输出如下:

Quality Sensor = 0
Start_Time             End_Time              Total_Down_Time
2022-01-01 09:00:00    2022-01-01 10:40:00     100 minutes 

2022-01-01 12:40:00    2022-01-01 13:20:00      40 minutes 
2022-01-03 01:20:00    2022-01-03 02:00:00      40 minutes 
2022-01-04 14:40:00    2022-01-04 15:20:00      40 minutes
2022-01-04 17:20:00    2022-01-04 18:40:00      80 minutes

首先,让我们把它们分成几组:

df.loc[df.date.diff().gt('00:20:00'), 'group'] = 1
df.group = df.group.cumsum().ffill().fillna(0)

然后,我们可以从每个组中提取我们想要的,并重命名:

df2 = df.groupby('group')['date'].agg(['min', 'max']).reset_index(drop=True)
df2.columns = ['start_time', 'end_time']

最后,我们将添加interval列并将其格式化为minutes:

df2['down_time'] = df2.end_time.sub(df2.start_time)
# Optional, I wouldn't do this here:
df2.down_time = df2.down_time.dt.seconds/60

输出:

start_time            end_time  down_time
0 2022-01-01 09:00:00 2022-01-01 10:40:00      100.0
1 2022-01-01 12:40:00 2022-01-01 13:20:00       40.0
2 2022-01-03 01:20:00 2022-01-03 02:00:00       40.0
3 2022-01-04 14:40:00 2022-01-04 15:20:00       40.0
4 2022-01-04 17:20:00 2022-01-04 18:40:00       80.0

假设日期列在date列下的数据框df中。您可以使用shift()创建带有后续日期/时间的第二列,然后通过减去它们创建具有您的持续时间的第三列。比如:

df['date2'] = df['date'].shift(-1)
df['difference'] = df['date2'] - df['date']

很明显,在末尾有一行没有后面的值,因此没有差异。

最新更新