绘制站点数据可用性图时出现Date关键字错误求助
解决数据可用性图绘制中的KeyError: Date问题
问题背景
想要基于给定数据集制作一份数据可用性图,样式参考横向站点日期可用性标记图。
数据集
Date Stn1 Stn2 Stn3 1980-01-01 NaN 2.269755 -1.613898 1980-01-02 0.400157 NaN -0.212740 1980-01-03 0.978738 0.045759 -0.895467 1980-01-04 NaN -0.187184 NaN 1980-01-05 NaN 1.532779 -0.510805 1980-01-06 -0.977278 1.469359 -1.180632 1980-01-07 0.950088 0.154947 -0.028182 1980-01-08 -0.151357 0.378163 NaN 1980-01-09 -0.103219 -0.887786 NaN 1980-01-10 0.410599 NaN NaN 1980-01-11 0.144044 -0.347912 -0.634322 1980-01-12 NaN 0.156349 -0.362741 1980-01-13 0.761038 1.230291 -0.672460 1980-01-14 0.121675 1.202380 -0.359553 1980-01-15 0.443863 -0.387327 -0.813146 1980-01-16 0.333674 -0.302303 -1.726283 1980-01-17 NaN NaN NaN 1980-01-18 -0.205158 NaN -0.401781 1980-01-19 0.313068 NaN -1.630198 1980-01-20 -0.854096 1.950775 NaN 1980-01-21 -2.552990 -0.509652 -0.907298 1980-01-22 0.653619 -0.438074 NaN 1980-01-23 0.864436 NaN NaN 1980-01-24 -0.742165 0.777490 NaN
尝试的代码
import matplotlib.pylab as plt import datetime from matplotlib import dates as mdates n = 3 # number of stations stns = [''] for i in range(n): stn = 'Stn' + str(i+1) stns.append(stn) df.loc[~np.isnan(df[stn]), stn] = i+1 df['Date'] = df['Date'].dt.strftime('%Y-%m-%d') dates = df.Date df.set_index('Date', inplace=True) ax = df.plot(legend=False) ax.set_yticks(range(n+1)) ax.set_yticklabels(stns) ax.set_xticks(range(len(dates))) ax.set_xticklabels(dates, rotation=45, ha='right') plt.tight_layout() plt.show()
报错信息
KeyError: Date
问题分析与修复
错误原因
- 未导入
numpy却使用np.isnan(),会引发依赖报错; - 若
Date列已被设为索引,后续访问df['Date']必然触发KeyError; - 原代码修改数值的逻辑会打乱数据类型,且绘图方式无法实现参考图的可用性标记效果。
修正后的代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 加载数据集(若数据未加载,可替换为实际读取方式,如read_csv) # df = pd.read_csv('your_data_file.csv', parse_dates=['Date']) n = 3 stns = ['Stn1', 'Stn2', 'Stn3'] # 标记有效数据:将非NaN值转为对应站点的y轴位置,NaN保留为空 availability = df[stns].notna() for idx, stn in enumerate(stns): availability[stn] = availability[stn].apply(lambda x: idx+1 if x else np.nan) # 创建画布与坐标轴 fig, ax = plt.subplots(figsize=(12, 4)) # 遍历每个站点,绘制可用日期的标记点 for idx, stn in enumerate(stns): # 筛选当前站点有数据的日期 valid_dates = df[availability[stn].notna()]['Date'] # 用正方形标记绘制数据点 ax.scatter(valid_dates, [idx+1]*len(valid_dates), marker='s', s=100, color='black') # 设置轴属性 ax.set_yticks(range(1, n+1)) ax.set_yticklabels(stns) ax.set_xlabel('Date') ax.set_title('Data Availability') # 格式化日期显示,避免重叠 plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
关键修复点
- 补充导入缺失的
pandas和numpy库; - 使用
notna()标记有效数据,避免修改原数据集的数值; - 采用散点图绘制标记点,贴合参考图的可用性展示样式;
- 保留
Date列的日期类型,让matplotlib自动处理时间轴的显示逻辑。
内容的提问来源于stack exchange,提问作者pro
相关产品推荐
相关产品推荐

