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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:35:30