如何使用matplotlib绘制'%d.%m.%Y %H:%M:%S'格式的时间戳数据
问题描述
我一直搞不懂怎么把数据里的时间戳用到matplotlib绘图里。
我的数据格式如下:
Label Power Cold_junction Prof100 Prof200 Prof300 Prof400 Prof600 Prof1000 Temp05 Temp10 Temp20 Temp30 Temp50 Temp100 Units V deg C % % % % % % °C °C °C °C °C °C 29.09.2020 11:20:00 10,9 25,4 1,8 4,6 3,5 0,2 #-INF #-INF 22,9 23,1 23,0 23,2 23,0 23,1 29.09.2020 11:30:00 10,9 25,5 1,8 4,5 3,5 0,1 #-INF #-INF 23,0 23,2 23,1 23,3 23,2 23,3 29.09.2020 11:40:00 10,9 25,7 1,8 4,5 3,4 0,0 #-INF #-INF 23,1 23,3 23,2 23,3 23,3 23,4 29.09.2020 11:50:00 10,9 25,8 1,7 4,4 3,4 0,0 #-INF #-INF 23,2 23,4 23,3 23,5 23,4 23,5
我现在已经可以用下面的代码把数据导入为numpy.ndarray类型:
import matplotlib.pyplot as plt import numpy as np import matplotlib.dates as mdates a = np.genfromtxt(r'shortglienig.txt', delimiter=None, skip_header=2, dtype=str, comments=None) a = np.char.replace(a, ',','.') a = np.char.replace(a,'\t',' ') date = a[0:len(a),0] time = a[0:len(a),1] prof100 = a[0:len(a), 4]
现在date、time和prof100都是numpy.ndarray类型的变量。我想要实现X轴为日期时间、Y轴为prof100数据的绘图,推测下一步要把时间数据转成matplotlib可识别的格式,想知道mdates.date2num或mdates.datestr2num函数能不能用,求对应的解决方案。
解决方案
你提到的mdates.datestr2num完全可以直接使用,操作逻辑非常简单:先把分开的日期、时间字符串拼接成完整的时间串,再转成matplotlib支持的格式即可,同时记得把prof100从字符串转成数值类型,否则无法正常绘图。
完整可运行代码如下:
import matplotlib.pyplot as plt import numpy as np import matplotlib.dates as mdates # 原有数据读取逻辑 a = np.genfromtxt(r'shortglienig.txt', delimiter=None, skip_header=2, dtype=str, comments=None) a = np.char.replace(a, ',','.') a = np.char.replace(a,'\t',' ') date = a[:,0] # 可简化numpy切片写法,和原逻辑效果一致 time = a[:,1] prof100 = a[:,4] # 新增时间、数据转换逻辑 datetime_str = np.char.add(np.char.add(date, ' '), time) # 拼接日期+时间字符串 x_time = mdates.datestr2num(datetime_str) # 转换为matplotlib可识别的时间格式 y_prof = prof100.astype(float) # 把prof100从字符串转成浮点数 # 绘图逻辑 fig, ax = plt.subplots(figsize=(10,4)) ax.plot(x_time, y_prof, marker='o', linestyle='-', color='#2c7fb8') # 自定义X轴显示格式,避免标签重叠 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M')) # 需要显示年份可改成'%Y-%m-%d %H:%M' fig.autofmt_xdate() # 自动旋转X轴标签 ax.set_xlabel('时间') ax.set_ylabel('Prof100 (%)') plt.grid(alpha=0.3) plt.show()
如果你更习惯先通过datetime模块解析时间,也可以用mdates.date2num实现同样的效果,转换部分代码示例:
from datetime import datetime datetime_list = [datetime.strptime(dt, '%d.%m.%Y %H:%M:%S') for dt in datetime_str] x_time = mdates.date2num(datetime_list)
两种方法的最终绘图效果完全一致,可根据自己的使用习惯选择。
内容的提问来源于stack exchange,提问作者cobra
相关产品推荐
相关产品推荐

