Python如何不硬编码列索引自动定位CSV中TMAX和TMIN列读取数据
实现自动匹配CSV字段索引的修改方案
核心思路
- 读取CSV表头后,直接通过
list.index()方法动态获取DATE、TMAX、TMIN三个字段的索引位置,完全抛弃硬编码的列号 - 修正原参考代码的缩进错误(原代码中数据校验和插入逻辑不在for循环内,导致仅处理最后一行数据,这也是你之前图表无法正常展示的主要原因)
- 移除硬编码的坐标轴范围配置,让matplotlib自动适配不同地区的温度区间
修改后完整代码
import csv import matplotlib.pyplot as plt from datetime import datetime # 切换不同CSV文件只需修改文件名即可 filename = 'data/sitka_2018_simple.csv' with open(filename) as f: reader = csv.reader(f) header_row = next(reader) # 动态获取所需字段的列索引 date_idx = header_row.index('DATE') tmax_idx = header_row.index('TMAX') tmin_idx = header_row.index('TMIN') name_idx = header_row.index('NAME') # 可选:用于动态生成标题 dates, highs, lows = [], [], [] location_name = "" for row in reader: # 取第一行的地点名称即可 if not location_name: location_name = row[name_idx] current_date = datetime.strptime(row[date_idx], '%Y-%m-%d') try: high = int(row[tmax_idx]) low = int(row[tmin_idx]) except ValueError: print(f"Missing data for {current_date}") else: dates.append(current_date) highs.append(high) lows.append(low) # 绘制高低温曲线 plt.style.use('seaborn') fig, ax = plt.subplots() ax.plot(dates, highs, c='red', alpha=0.5) ax.plot(dates, lows, c='blue', alpha=0.5) ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1) # 图表格式配置 title = f"Daily high and low temps - 2018\n{location_name}" ax.set_title(title, fontsize=20) ax.set_xlabel('', fontsize=16) fig.autofmt_xdate() ax.set_ylabel("Temperature (F)", fontsize=16) ax.tick_params(axis='both', which='major', labelsize=16) plt.show()
关键修改说明
- 动态获取列索引:读取表头后通过
index()方法自动定位所需字段位置,不受CSV字段排序影响 - 修正缩进:将日期转换、数据校验、列表插入的逻辑全部放到for循环内部,保证逐行处理数据
- 删除硬编码的坐标轴配置,避免不同地区数据超出预设范围导致显示异常
- 新增自动读取地点名称的逻辑,切换CSV文件时标题可以自动适配对应地点
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

