如何用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
相关产品推荐
相关产品推荐

