Pandas如何基于全表日期时间数据填充列并计算应用Downtime
Pandas应用故障时长计算实现方案
1. 样例数据生成(方便本地调试)
import pandas as pd import numpy as np from datetime import datetime, timedelta # 生成符合你描述字段的样例数据 data = { "UTC时间戳": [1690848000, 1690848300, 1690848600, 1690848900, 1690849200, 1690852800, 1690853100], "应用名称": ["app1", "app1", "app1", "app1", "app1", "app2", "app2"], "运行状态": ["passing", "failing", "failing", "passing", "passing", "failing", "passing"], "开始时间": [ "2023-08-01 00:00:00", "2023-08-01 00:05:00", "2023-08-01 00:10:00", "2023-08-01 00:15:00", "2023-08-01 00:20:00", "2023-08-01 01:20:00", "2023-08-01 01:25:00" ], "结束时间": [ "2023-08-01 00:05:00", "2023-08-01 00:10:00", "2023-08-01 00:15:00", "2023-08-01 00:20:00", "2023-08-01 00:25:00", "2023-08-01 01:25:00", "2023-08-01 01:30:00" ] } df = pd.DataFrame(data)
2. 核心计算代码
# 步骤1:预处理-时间格式转换+排序 df["开始时间"] = pd.to_datetime(df["开始时间"]) df["结束时间"] = pd.to_datetime(df["结束时间"]) df = df.sort_values(by=["应用名称", "开始时间"]).reset_index(drop=True) # 步骤2:按应用分组标记独立故障段 def mark_fault_periods(group): # 标记故障段起点:状态从非failing切换为failing group["状态切换"] = (group["运行状态"] == "failing") & (group["运行状态"].shift(1) != "failing") # 生成故障段编号,同一应用内多段故障依次递增 group["故障段ID"] = group["状态切换"].cumsum() # 过滤掉无failing状态的无效段 group = group[group["运行状态"].eq("failing").groupby(group["故障段ID"]).transform("any")] return group df = df.groupby("应用名称", group_keys=False).apply(mark_fault_periods) # 步骤3:计算单段故障时长 fault_periods = df.groupby(["应用名称", "故障段ID"]).agg( 故障开始时间=("开始时间", "min"), # 取故障段最后一条记录后的第一条passing状态的开始时间作为恢复时间 故障恢复时间=("结束时间", lambda x: df.loc[x.index[-1]+1, "开始时间"] if (x.index[-1]+1 < len(df) and df.loc[x.index[-1]+1, "运行状态"] == "passing") else pd.NaT) ).reset_index() # 过滤未恢复的故障(如需保留未恢复故障可删除该行) fault_periods = fault_periods.dropna(subset=["故障恢复时间"]) # 生成两种格式的时长字段 fault_periods["故障时长(时间格式)"] = fault_periods["故障恢复时间"] - fault_periods["故障开始时间"] fault_periods["故障时长(分钟)"] = fault_periods["故障时长(时间格式)"].dt.total_seconds() / 60 # 步骤4:计算每个应用的总故障时长 fault_periods["应用总故障时长(分钟)"] = fault_periods.groupby("应用名称")["故障时长(分钟)"].transform("sum")
3. 结果说明
最终得到的fault_periods为目标结构DataFrame,包含字段:
- 应用名称:对应原数据的应用唯一标识
- 故障段ID:同一应用下的故障段编号,多段独立故障依次递增
- 故障开始时间:该段故障首次触发failing的时间
- 故障恢复时间:该段故障结束后首次回到passing的时间
- 故障时长(时间格式):timedelta类型时长,直接展示为天/时/分/秒格式
- 故障时长(分钟):数值类型单段故障分钟数,可直接用于统计计算
- 应用总故障时长(分钟):同一应用下所有已恢复故障的时长总和
内容的提问来源于stack exchange,提问作者jmin
相关产品推荐
相关产品推荐

