Matplotlib绘图X轴日期时间显示异常问题求助
问题:Matplotlib绘制时间温度图时X轴日期显示异常
我需要绘制Y轴为温度、X轴为日期时间的图表,温度数据能正常显示,但日期时间轴出现异常:CSV文件中日期时间列格式为m/d/Y H:M:S(示例:6/13/2022 2:36:00 PM),但绘图时X轴显示为从0开始递增的整数序列。
初始代码
#Import libraries from dataclasses import dataclass from textwrap import indent import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd import numpy as np import csv from datetime import datetime #read the CSV df = pd.read_csv(r"C:\Users\pmay\Desktop\Python\LOGRPT61.csv", parse_dates=True ) change_format = date_sr.dt.strftime('%m/%d/%Y %H:%M:%S') #Identify column data ctrlTC = df.iloc[:,[1,2,3,4,5,6,7,8,]] #Label Axes plt.xlabel('Time') plt.ylabel('Temp [deg C]') #Plot the data plt.plot(ctrlTC)# kind='line') plt.rcParams["figure.figsize"] = [10, 7] plt.rcParams["figure.autolayout"] = True line1, = plt.plot([1], label="Control TC1") line2, = plt.plot([2], label="Control TC2") line3, = plt.plot([3], label="Control TC3") line4, = plt.plot([4], label="Control TC4") line5, = plt.plot([5], label="Control TC5") line6, = plt.plot([6], label="Control TC6") line7, = plt.plot([7], label="Control TC7") line8, = plt.plot([8], label="Control TC8") plt.legend(loc="upper left")
初始问题现象
生成的图表X轴为整数序列,未显示实际日期时间。
更新后的代码
#Import libraries from dataclasses import dataclass from textwrap import indent import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd import numpy as np import csv import os import datetime as dt from statistics import mean from datetime import datetime from datetime import date #read the CSV os.chdir(r"C:\Users\pmay\Desktop\Python") df = pd.read_csv(r"C:\Users\pmay\Desktop\Python\LOGRPT61.csv",parse_dates=['Time']) df['Time'] = pd.to_datetime(df['Time']) #Identify column data ctrlTC = df.iloc[:,[1,2,3,4,5,6,7,8]] df.info() Time = df['Time'] #Label Axes plt.xlabel('Time') plt.ylabel('Temp [deg C]') #Plot the data x = Time y = ctrlTC plt.plot(x,y) plt.gcf().autofmt_xdate() plt.rcParams["figure.figsize"] = [10, 7] plt.rcParams["figure.autolayout"] = True line1, = plt.plot([1], label="Control TC1") line2, = plt.plot([2], label="Control TC2") line3, = plt.plot([3], label="Control TC3") line4, = plt.plot([4], label="Control TC4") line5, = plt.plot([5], label="Control TC5") line6, = plt.plot([6], label="Control TC6") line7, = plt.plot([7], label="Control TC7") line8, = plt.plot([8], label="Control TC8") plt.legend(loc="upper left")
更新后现象
新图表仍未正确渲染时间轴,存在图例与曲线不匹配的问题。
数据样例
Time Loop #1.Process Value Loop #2.Process Value 0 2022-06-13 14:36:00 25.3 25.0 1 2022-06-13 14:37:00 25.3 25.0 2 2022-06-13 14:38:00 25.3 25.0 3 2022-06-13 14:39:00 25.3 24.9 4 2022-06-13 14:40:00 25.3 25.0
疑问与目标
- 为何读取CSV后日期格式自动变为
Y-m-D H:M:S(原CSV为m/d/Y H:M:S)? - CSV共11240行(含表头),时间范围为2022年6月13日至21日,间隔1分钟,最终需让代码适配更多历史及未来CSV文件。
解决方案
1. 日期格式问题解释与显示调整
Pandas读取日期后会以datetime64类型存储,默认显示为ISO标准的Y-m-d H:M:S,这是内部存储格式,不影响数据有效性。若要在图表X轴显示原格式,可手动设置日期格式化器:
import matplotlib.dates as mdates # 绘制数据后添加以下代码 ax = plt.gca() # 设置X轴日期显示格式为m/d/Y H:M:S date_format = mdates.DateFormatter('%m/%d/%Y %H:%M:%S') ax.xaxis.set_major_formatter(date_format) # 自动旋转日期标签避免重叠 plt.gcf().autofmt_xdate()
2. 修复绘图逻辑问题
当前代码存在重复绘图问题:先通过plt.plot(x,y)绘制了所有温度序列,之后又绘制了8个仅含单个点的序列,导致图例与实际曲线不匹配,还可能干扰时间轴渲染。推荐用Pandas自带绘图功能更简洁高效:
# 直接用Pandas绘图,自动关联时间轴 df.plot( x='Time', y=['Loop #1.Process Value', 'Loop #2.Process Value', 'Loop #3.Process Value', 'Loop #4.Process Value', 'Loop #5.Process Value', 'Loop #6.Process Value', 'Loop #7.Process Value', 'Loop #8.Process Value'], figsize=(10,7) ) plt.xlabel('Time') plt.ylabel('Temp [deg C]') plt.legend([f"Control TC{i}" for i in range(1,9)], loc='upper left') plt.autofmt_xdate() plt.tight_layout() plt.show()
3. 通用化CSV读取逻辑
为适配不同格式的CSV,可确保日期列被正确解析,无需重复调用pd.to_datetime:
from datetime import datetime # 针对12小时制带AM/PM的格式,指定解析规则 df = pd.read_csv( "LOGRPT61.csv", parse_dates=['Time'], date_parser=lambda x: datetime.strptime(x, '%m/%d/%Y %I:%M:%S %p') ) # 若不确定日期格式,可让Pandas自动推断 # df = pd.read_csv("LOGRPT61.csv", parse_dates=['Time'], infer_datetime_format=True)
内容的提问来源于stack exchange,提问作者MagicMagnets
相关产品推荐
相关产品推荐

