使用Pandas绘制赛车圈速年份对应图表出错,求修正方法
问题分析与修正方案
核心错误点
- 圈速列
q1为字符串格式,直接取min()会按字符串字典序比较,而非实际时间长度
比如"1:18.530"和"1:18.233",字符串比较时会错误认为前者更小,完全不符合实际圈速的快慢逻辑。 - 未对圈速数据做时间格式转换,无法正确计算最小圈速,导致图表Y轴的数值逻辑完全错误。
修正后的代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter # 读取数据 cir = pd.read_csv('circuits.csv') races = pd.read_csv('races.csv') qua = pd.read_csv('qualifying.csv') # 合并数据 racescir = pd.merge(cir, races, how='inner', left_on='circuitId', right_on='circuitId') res = pd.merge(racescir, qua, how='inner', left_on='raceId', right_on='raceId') # 筛选目标赛道(circuitId=9) res_si = res[res['circuitId'] == 9].copy() # 定义函数:将"分:秒.毫秒"格式的字符串转换为总秒数 def lap_time_to_seconds(lap_str): if pd.isna(lap_str): return np.nan minutes, rest = lap_str.split(':') seconds, milliseconds = rest.split('.') return int(minutes)*60 + float(seconds) + float(milliseconds)/1000 # 转换圈速为可计算的秒数 res_si['q1_seconds'] = res_si['q1'].apply(lap_time_to_seconds) # 按年份分组取最小圈速,同时确保年份按升序排列 res_si_gro = res_si.groupby(['year'])['q1_seconds'].min().sort_index() # 绘制图表 fig, gr = plt.subplots(figsize=(10,6)) gr.plot(res_si_gro.index, res_si_gro.values, marker='o', linestyle='-') # 设置图表基础元素 gr.set_xlabel('年份') gr.set_ylabel('圈速') gr.set_title('赛道ID=9各年份最快Q1圈速') gr.grid(True, alpha=0.3) # 将Y轴秒数转换回"分:秒.毫秒"格式,提升可读性 def seconds_to_lap_time(x, pos): minutes = int(x // 60) seconds = x % 60 return f"{minutes}:{seconds:.3f}" gr.yaxis.set_major_formatter(FuncFormatter(seconds_to_lap_time)) plt.show()
关键修正说明
- 圈速格式转换:通过自定义函数把字符串格式的圈速转为总秒数,确保
min()计算的是实际最快圈速。 - 数据排序:
sort_index()保证X轴年份按时间顺序排列,符合时间序列图表的展示逻辑。 - 图表优化:添加轴标签、标题、网格,同时将Y轴转换回易读的圈速格式,让图表信息更直观。
内容的提问来源于stack exchange,提问作者Andrius Ra
相关产品推荐
相关产品推荐

