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

Matplotlib图表添加日期X轴后显示异常的问题求助

问题分析与解决:Matplotlib日期X轴显示异常

问题背景

有一份每小时记录的网络速度CSV文件,列包含Date、Time、Download、Upload、ping,样例数据:

230302,2305,835.89,109.91,11.46
230303,0005,217.97,109.58,5.222
230303,0105,790.61,111.41,5.191
230303,0205,724.59,109.23,9.259
230303,0305,820.04,111.06,4.376

使用0-x序列作为X轴时图表显示正常,但改用日期作为X轴后显示异常,相关代码如下:

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = 'C:/Users/tim/Documents/p5e/Internet_Speed_Tests.csv'
with open(filename) as f:
    reader = csv.reader(f)

    dates = []
    times = []
    downs = []
    ups = []
    pings = []

    for row in reader:
        #date = int(row[0])
        current_date = datetime.strptime(row[0],'%y%m%d')
        time = int(row[1])
        #current_time = datetime.strptime(row[1],'%H%m')
        #dateandtime = current_date + current_time
        down = float(row[2])
        up = float(row[3])
        ping = float(row[4])

        dates.append(current_date)
        #times.append(current_time)
        downs.append(down)
        ups.append(up)
        pings.append(ping)

fig, ax = plt.subplots()
ax.set_title("Internet Speed", fontsize=24)
ax.set_ylabel("Speed", fontsize=16)
ax.set_xlabel('date', fontsize=16)
fig.autofmt_xdate()
ax.plot(dates, downs)
ax.plot(dates, ups)

plt.show()

问题根源

  1. 仅解析日期,忽略时间信息:代码中只将Date列解析为datetime对象,但丢弃了Time列的小时和分钟数据,导致同一天内的所有数据点都对应同一个日期值(如230303的4条数据都对应2023-03-03 00:00:00)。Matplotlib绘制时会把这些点堆叠在X轴的同一位置,造成折线重叠、显示异常。
  2. 错误的时间合并方式:注释掉的代码尝试直接用+合并datetime和datetime对象,这是不允许的,需要用timedelta处理时间增量。

修复方案

将Date和Time合并为包含具体时分的完整datetime对象,作为X轴数据:

import csv
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

filename = 'C:/Users/tim/Documents/p5e/Internet_Speed_Tests.csv'
with open(filename) as f:
    reader = csv.reader(f)

    timestamps = []
    downs = []
    ups = []
    pings = []

    for row in reader:
        # 解析日期部分
        current_date = datetime.strptime(row[0], '%y%m%d')
        # 解析时间部分:拆分HHMM格式为小时和分钟
        time_str = row[1]
        hours = int(time_str[:2])
        minutes = int(time_str[2:])
        # 合并日期与时间
        current_timestamp = current_date + timedelta(hours=hours, minutes=minutes)
        
        down = float(row[2])
        up = float(row[3])
        ping = float(row[4])

        timestamps.append(current_timestamp)
        downs.append(down)
        ups.append(up)
        pings.append(ping)

fig, ax = plt.subplots()
ax.set_title("Internet Speed", fontsize=24)
ax.set_ylabel("Speed", fontsize=16)
ax.set_xlabel('Datetime', fontsize=16)
fig.autofmt_xdate()
# 使用完整时间戳绘制曲线
ax.plot(timestamps, downs, label='Download')
ax.plot(timestamps, ups, label='Upload')
# 添加图例区分两条曲线
ax.legend()

plt.show()

关键改进点

  • 生成带时分的完整时间戳,确保每个数据点在X轴上有唯一的位置,折线能正确展示时间序列的变化
  • 使用timedelta实现日期与时间的合法合并
  • 添加图例,提升图表可读性

内容的提问来源于stack exchange,提问作者Entropy1024

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:34:54