如何用Python处理含千条记录的CSV文件并绘制图表?
完成CSV数据读取与图表绘制的Python解决方案
嘿,你已经有了一个不错的起步代码,但还有几个关键地方需要完善才能顺利画出清晰的图表,尤其是处理上千条记录的场景。我帮你把代码补全并做了优化,来看看吧:
修正并优化后的完整代码
from matplotlib import style from matplotlib import pylab as plt import numpy as np import csv import datetime # 设置绘图风格,ggplot风格看起来更清爽 style.use('ggplot') filename = 'results.csv' # 初始化存储数据的列表 values = [] dates = [] # 读取CSV文件,处理上千条记录也没问题 with open(filename, 'r') as csvfile: csvreader = csv.reader(csvfile) # 如果你的CSV文件有表头,记得打开下面这行注释跳过表头 # next(csvreader) for row in csvreader: # 确保每行有两个有效字段 if len(row) == 2: try: # 把数值转成float类型——这很重要,不然字符串没法绘图 values.append(float(row[0])) # 按照指定格式解析日期字符串 dates.append(datetime.datetime.strptime(row[1], '%a %b %d')) except ValueError as e: # 遇到格式错误的行直接跳过,避免程序崩溃 print(f"跳过无效数据行: {row}, 原因: {e}") # 转成numpy数组,处理大数据时效率更高 values = np.array(values) dates = np.array(dates) # 创建一个合适大小的画布,避免大量数据挤在一起 plt.figure(figsize=(12, 6)) # 绘制折线图,调整标记和线条样式适配大量数据 plt.plot(dates, values, marker='o', markersize=3, linestyle='-', linewidth=1, label='数值趋势') # 设置图表的标签和标题,让图表更易读 plt.xlabel('日期', fontsize=12) plt.ylabel('数值', fontsize=12) plt.title('CSV数据趋势图', fontsize=14) # 旋转x轴的日期标签,防止大量日期重叠看不清 plt.xticks(rotation=45) # 添加图例 plt.legend() # 自动调整布局,避免标签被截断 plt.tight_layout() # 显示图表 plt.show() # 如果需要保存高清图表,解开下面的注释 # plt.savefig('data_trend.png', dpi=300)
关键优化点说明
- 异常处理:处理上千条数据时难免会有格式错误的行,加个
try-except可以让程序不崩溃,还能提示错误位置 - 数据类型转换:把
value转成float是核心——原来的代码里存的是字符串,根本没法用来绘图 - 图表适配:设置合适的画布大小、旋转日期标签,避免大量数据导致图表拥挤
- 可读性优化:添加标题、坐标轴标签和图例,让图表信息更清晰
备选高效方案(适合大数据量)
如果你的CSV真的有上千条记录,用pandas会比原生csv模块更高效,代码也更简洁:
import pandas as pd from matplotlib import style import matplotlib.pyplot as plt style.use('ggplot') # 直接读取CSV,自动处理数据类型 df = pd.read_csv('results.csv', names=['value', 'date'], header=None) # 快速解析日期 df['date'] = pd.to_datetime(df['date'], format='%a %b %d') # 一键绘图 df.plot(x='date', y='value', figsize=(12,6), marker='o', markersize=3, linewidth=1) plt.xlabel('日期') plt.ylabel('数值') plt.title('CSV数据趋势图') plt.xticks(rotation=45) plt.tight_layout() plt.show()
pandas内部做了很多优化,处理大数据的速度会快不少,而且代码量少很多,推荐试试。
内容的提问来源于stack exchange,提问作者Gerasimos
相关产品推荐
相关产品推荐

