如何用Pandas和Matplotlib高效绘制文本文件中的非均匀时间序列数据?
解决时间序列绘图的两个核心问题:X轴重叠与加载缓慢
第一步:先把数据处理成标准时间序列格式
原始数据的日期只出现在每天第一行,必须先补全所有行的日期,生成完整的datetime索引,这是后续高效处理的基础:
import pandas as pd # 逐行读取并补全日期 lines = [] current_date = None with open("你的数据文件.txt", "r") as f: for line in f: line = line.strip() if not line: continue # 判断该行是否包含日期标识 if len(line.split()) == 2: time_part, current_date = line.split() time_str, vals = time_part.split(",", 1) else: time_str, vals = line.split(",", 1) # 拼接完整时间字符串并拆分数值 dt_str = f"{current_date} {time_str}" val1, val2, val3 = vals.split(",") lines.append([dt_str, float(val1), float(val2), float(val3)]) # 转为DataFrame并解析时间索引 df = pd.DataFrame(lines, columns=["datetime", "Voltage", "Max", "Min"]) df["datetime"] = pd.to_datetime(df["datetime"], format="%d-%m-%Y %H:%M:%S") df.set_index("datetime", inplace=True)
第二步:优化X轴标签,解决重叠问题
用pandas绘图接口配合matplotlib日期定位器,比纯matplotlib更高效,同时精准控制标签密度:
import matplotlib.pyplot as plt import matplotlib.dates as mdates plt.figure(figsize=(15, 9)) # 直接用DataFrame批量绘图,自动关联时间索引 df.plot(y=["Voltage", "Max", "Min"], ax=plt.gca(), color=["#自定义颜色", "r", "g"]) # 配置X轴显示规则 ax = plt.gca() # 按天显示主标签,格式为YYYY-MM-DD ax.xaxis.set_major_locator(mdates.DayLocator(interval=1)) ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d")) # 旋转标签避免重叠,调整底部边距防止标签被截断 plt.xticks(rotation=45) plt.subplots_adjust(bottom=0.15) plt.xlabel("日期") plt.ylabel("电压") plt.legend() plt.tight_layout() plt.show()
如果数据跨月,可以调整标签密度:
# 每周显示一个主标签 ax.xaxis.set_major_locator(mdates.DayLocator(interval=7)) # 或者直接显示月份标签 ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m")) # 补充次要刻度显示日期 ax.xaxis.set_minor_locator(mdates.DayLocator(interval=5))
第三步:解决图表加载缓慢的问题
- 数据降采样:如果数据量极大(比如每秒一条),按时间间隔降采样保留趋势:
# 按10分钟降采样,取均值(也可用max/min/last) df_resampled = df.resample("10T").mean() # 用降采样后的数据绘图 df_resampled.plot(y=["Voltage", "Max", "Min"], ax=plt.gca()) - 换高效绘图后端:用
plotly替代matplotlib,交互性更强且大数据下加载更快;或者用matplotlib的Agg非交互式后端。 - 避免重复绘图:直接用DataFrame批量绘图接口,不要循环绘制单条数据,减少渲染开销。
内容的提问来源于stack exchange,提问作者user23255092
相关产品推荐
相关产品推荐

