基于两列均值绘图及Pandas时间差处理技术咨询
消防救护车数据集分组计算与可视化解决方案
一、数据预处理与Time_Diff优化
- 先将
IA和TOC列转为datetime类型,计算出Time_Diff(timedelta类型) - 把
Time_Diff转为总分钟数(方便后续求平均计算),后续再格式化回HH:MM格式去掉"0 days"
import pandas as pd import matplotlib.pyplot as plt # 读取数据集(替换为你的本地文件路径) df = pd.read_csv("fire_ambulance_data.csv") # 转换时间列 df['IA'] = pd.to_datetime(df['IA'], format='%d/%m/%Y %H:%M:%S') df['TOC'] = pd.to_datetime(df['TOC'], format='%d/%m/%Y %H:%M:%S') # 计算时间差 df['Time_Diff'] = df['TOC'] - df['IA'] # 将timedelta转为总分钟数(用于平均值计算) df['Time_Diff_Mins'] = df['Time_Diff'].dt.total_seconds() / 60
二、按Station分组计算平均响应时间
按Station分组对分钟数求平均,再将结果格式化为HH:MM的干净格式:
# 分组计算平均响应分钟数 station_avg = df.groupby('Station')['Time_Diff_Mins'].mean().reset_index() # 将平均分钟数转为HH:MM格式 def mins_to_hhmm(mins): hours = int(mins // 60) minutes = int(mins % 60) return f"{hours:02d}:{minutes:02d}" station_avg['Avg_Time'] = station_avg['Time_Diff_Mins'].apply(mins_to_hhmm) # 输出最终结果 print(station_avg[['Station', 'Avg_Time']])
三、绘制平均响应时间图表
用柱状图展示各站点的平均响应时间,避免之前只显示计数的问题:
# 设置图表尺寸 plt.figure(figsize=(12, 8)) bars = plt.bar(station_avg['Station'], station_avg['Time_Diff_Mins']) # 在每个柱子上方标注HH:MM格式的时间 for bar, time in zip(bars, station_avg['Avg_Time']): height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height, time, ha='center', va='bottom') plt.title('各消防站平均响应时间') plt.xlabel('消防站') plt.ylabel('平均响应时间(分钟)') plt.xticks(rotation=45) plt.tight_layout() plt.show()
关键说明
- 转成分钟数计算的原因:timedelta类型直接求平均会自带"0 days",转为数值计算更灵活,再格式化就能得到干净的时间展示
- 绘图用数值作为y轴、标注显示格式化时间,既保证图表数据准确,又满足你要的展示效果
内容的提问来源于stack exchange,提问作者mattyb
相关产品推荐
相关产品推荐

