如何以带完整时分秒的日期时间序列为X轴绘制对应通量数值
问题解决步骤
报错原因
你将x轴处理为二维嵌套列表的格式不符合matplotlib绘图接口的输入要求,plot函数要求x轴传入一维可哈希的序列,二维嵌套结构会触发TypeError: unhashable type: 'numpy.ndarray'报错,且完全没有必要拆分日期和时间为两个独立字段。
正确处理方案
直接将时间列转换为Python原生支持的datetime类型,matplotlib可直接识别该类型作为时间轴坐标,同时支持自定义刻度显示规则。
步骤1:读取数据时直接解析时间列
修改pd.read_csv参数,直接将time_tag列解析为datetime类型:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates col_list = ['time_tag', 'ZPGT10E'] # 新增parse_dates参数直接解析时间列 df = pd.read_csv('sep2017.csv', usecols=col_list, skiprows=717, parse_dates=['time_tag'])
如果已经完成数据读取,也可以手动转换格式:
df['time_tag'] = pd.to_datetime(df['time_tag'], format='%Y-%m-%d %H:%M:%S.%f')
步骤2:直接使用datetime列绘图
直接将time_tag列作为x轴输入,不需要额外拆分处理:
# 替换为你实际的avg计算逻辑,保证avg和x的长度完全一致 x = df['time_tag'] avg = df['ZPGT10E'] plt.plot(x, avg, color='red', label='average') # 优化x轴显示,同时展示日期和时刻,避免标签重叠 ax = plt.gca() # 设置主刻度为天,显示日期 ax.xaxis.set_major_locator(mdates.DayLocator(interval=1)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 设置次刻度为6小时间隔,显示时刻 ax.xaxis.set_minor_locator(mdates.HourLocator(interval=6)) ax.xaxis.set_minor_formatter(mdates.DateFormatter('%H:%M')) # 旋转标签避免重叠 plt.xticks(rotation=45, ha='right') plt.legend() plt.tight_layout() plt.show()
效果说明
该方案可以完整展示从2017-09-01到2017-09-30的所有5分钟间隔时间点,不会按日期聚合数据,同时x轴标签可通过调整mdates的刻度规则灵活修改显示密度,避免标签重叠。
内容的提问来源于stack exchange,提问作者astralled
相关产品推荐
相关产品推荐

