You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:02