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

使用Pandas绘制赛车圈速年份对应图表出错,求修正方法

问题分析与修正方案

核心错误点

  1. 圈速列q1为字符串格式,直接取min()会按字符串字典序比较,而非实际时间长度
    比如"1:18.530"和"1:18.233",字符串比较时会错误认为前者更小,完全不符合实际圈速的快慢逻辑。
  2. 未对圈速数据做时间格式转换,无法正确计算最小圈速,导致图表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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:18:19