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()
问题根源
- 仅解析日期,忽略时间信息:代码中只将
Date列解析为datetime对象,但丢弃了Time列的小时和分钟数据,导致同一天内的所有数据点都对应同一个日期值(如230303的4条数据都对应2023-03-03 00:00:00)。Matplotlib绘制时会把这些点堆叠在X轴的同一位置,造成折线重叠、显示异常。 - 错误的时间合并方式:注释掉的代码尝试直接用
+合并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
相关产品推荐
相关产品推荐

