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

如何用Python基于停机时间与日期绘制应用7/30/90天uptime图

解决方案

1. 数据预处理

先把日期字段转成标准格式,按日期汇总每天的总停机时长,再算出当天的正常运行时间(默认按全天24小时算,要是你按工作日8小时就改数值):

import pandas as pd
import matplotlib.pyplot as plt

# 读入CSV数据
data = pd.read_csv("你的数据文件.csv")

# 把date列转成日期类型,方便后续时间筛选
data['date'] = pd.to_datetime(data['date'])

# 按日期聚合,算出每天的总停机时间
daily_downtime = data.groupby('date')['downtime(hrs)'].sum().reset_index()

# 计算每天的uptime:全天24小时减去当天总停机时长
daily_downtime['uptime(hrs)'] = 24 - daily_downtime['downtime(hrs)']
# 要是按工作日8小时算,改成:8 - daily_downtime['downtime(hrs)']

2. 筛选指定时间范围的数据

以数据里的最新日期为基准,筛选出最近7、30、90天的记录:

# 获取数据里的最新日期
latest_date = daily_downtime['date'].max()

# 快速筛选指定天数内的数据
def get_recent_data(df, days):
    cutoff = latest_date - pd.Timedelta(days=days)
    return df[df['date'] >= cutoff]

# 生成三个时间范围的数据集
last7_days = get_recent_data(daily_downtime, 7)
last30_days = get_recent_data(daily_downtime, 30)
last90_days = get_recent_data(daily_downtime, 90)

3. 绘制uptime图表

用子图分别展示三个时间范围的uptime,清晰直观:

# 创建画布和三个子图
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 12))

# 最近7天的uptime柱状图
ax1.bar(last7_days['date'], last7_days['uptime(hrs)'], color='#2ecc71')
ax1.set_title('最近7天应用正常运行时间')
ax1.set_ylabel('时长(小时)')
ax1.set_ylim(0, 24)  # 对应24小时总时长,按需调整

# 最近30天的uptime柱状图
ax2.bar(last30_days['date'], last30_days['uptime(hrs)'], color='#2ecc71')
ax2.set_title('最近30天应用正常运行时间')
ax2.set_ylabel('时长(小时)')
ax2.set_ylim(0, 24)

# 最近90天的uptime柱状图
ax3.bar(last90_days['date'], last90_days['uptime(hrs)'], color='#2ecc71')
ax3.set_title('最近90天应用正常运行时间')
ax3.set_xlabel('日期')
ax3.set_ylabel('时长(小时)')
ax3.set_ylim(0, 24)

# 调整布局,避免标签重叠
plt.tight_layout()

# 保存图片
plt.savefig("uptime_trends.jpg", bbox_inches="tight")
plt.show()

可选:展示uptime百分比

要是想更直观展示可用性,改成百分比计算:

# 计算uptime占比(按24小时算)
daily_downtime['uptime_pct'] = (daily_downtime['uptime(hrs)'] / 24) * 100

然后绘图时把y轴换成uptime_pct,ylim设为0-100就行。

补漏:处理无停机记录的日期

如果你的数据里有些日期没有停机记录,这些日期不会出现在聚合结果里,导致图表有断档。可以生成连续日期序列,填充缺失日期的停机时长为0:

# 生成从数据最早日期到最新日期的连续日期
full_date_range = pd.date_range(start=daily_downtime['date'].min(), end=latest_date, freq='D')
# 重新索引,填充缺失值为0
daily_downtime_full = daily_downtime.set_index('date').reindex(full_date_range).fillna(0).reset_index().rename(columns={'index':'date'})
# 重新计算uptime
daily_downtime_full['uptime(hrs)'] = 24 - daily_downtime_full['downtime(hrs)']

之后用daily_downtime_full来筛选时间范围和绘图,图表就会是连续的了。

内容的提问来源于stack exchange,提问作者Hound

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:50:24