You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制站点数据可用性图时出现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


问题分析与修复

错误原因

  1. 未导入numpy却使用np.isnan(),会引发依赖报错;
  2. 若Date列已被设为索引,后续访问df['Date']必然触发KeyError;
  3. 原代码修改数值的逻辑会打乱数据类型,且绘图方式无法实现参考图的可用性标记效果。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:35:22