如何为时序温度数据设置固定时间区间的x_lims进行绘图?
解决Matplotlib设置固定时间区间x轴范围导致空白图的问题
问题根源
你遇到的空白图问题,核心原因是时间戳的日期不匹配:
当你用pd.Timestamp('9:00')时,Pandas会默认使用当前系统日期生成时间戳,但你的数据日期是2018-05-10,这就导致你设置的x轴范围(今天的9:00-21:00)和实际数据的时间区间完全没有重叠,自然看不到任何曲线。
解决方案
根据你的需求(单天绘图、多天统一x轴范围),这里提供两种针对性的解决方法:
方法1:针对单天数据,拼接数据日期与目标时间
直接提取当前数据文件的日期,和你想要的9:00、21:00拼接成完整的时间戳,确保x轴范围和数据日期一致:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter # 读取并预处理数据 dayX = pd.read_csv('path/to/file/dayX.csv') dayX['timeStamp'] = pd.to_datetime(dayX['timeStamp'], format='%Y-%m-%d %H:%M:%S') # 匹配CSV中的时间格式 dayX = dayX.dropna(subset=['meanT']) # 丢弃无效的NaN数据 # 获取当前数据的日期信息 data_date = dayX['timeStamp'].dt.date.iloc[0] # 构造和数据日期一致的目标时间区间 start_time = pd.Timestamp(f"{data_date} 09:00:00") end_time = pd.Timestamp(f"{data_date} 21:00:00") # 绘图 fig, ax1 = plt.subplots(1,1) ax1.plot(dayX['timeStamp'], dayX['meanT']) ax1.xaxis.set_major_formatter(DateFormatter('%H:%M')) ax1.set_xlim(start_time, end_time) # 现在范围和数据完全匹配 fig.autofmt_xdate() plt.show()
方法2:多天统一x轴(忽略日期,仅保留时间)
如果后续要批量处理多天数据,且希望所有图的x轴都固定为9:00-21:00(无需关心具体日期),可以把时间戳转换为一天中的小时数值,这样x轴就变成纯时间范围,不再受日期影响:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取并预处理数据 dayX = pd.read_csv('path/to/file/dayX.csv') dayX['timeStamp'] = pd.to_datetime(dayX['timeStamp'], format='%Y-%m-%d %H:%M:%S') dayX = dayX.dropna(subset=['meanT']) # 新增列:将时间转换为一天中的小时数(比如9:30就是9.5) dayX['hour_of_day'] = dayX['timeStamp'].dt.hour + dayX['timeStamp'].dt.minute/60 + dayX['timeStamp'].dt.second/3600 # 绘图 fig, ax1 = plt.subplots(1,1) ax1.plot(dayX['hour_of_day'], dayX['meanT']) # 固定x轴范围为9到21,自定义刻度显示为时间格式 ax1.set_xlim(9, 21) ax1.set_xticks(np.arange(9, 22, 2)) # 每2小时设置一个刻度 ax1.set_xticklabels([f"{h}:00" for h in np.arange(9, 22, 2)]) plt.xlabel('Time') plt.ylabel('Mean Temperature') plt.show()
这种方法的好处是,不管你处理哪一天的数据,x轴都固定在9-21的时间区间,完全不用考虑日期,非常适合批量绘图。
额外提示
- 注意时间格式匹配:原代码中用了
format='%Y %m %d %H:%M:%S.%f',但你的示例数据时间是2018-05-10 08:55:00,格式应该对应为%Y-%m-%d %H:%M:%S,格式不匹配会导致时间转换失败,一定要核对好。 - 提前清理NaN值:绘图时NaN会导致曲线中断,用
dropna可以让曲线更连贯。
内容的提问来源于stack exchange,提问作者user3168953
相关产品推荐
相关产品推荐

