【问题标题】:Not able to annotate on plot - KeyError无法在绘图上注释 - KeyError
【发布时间】:2020-07-02 10:34:36
【问题描述】:

我有以下代码:

import pandas as pd
import datetime as date
from pandas_datareader import data as web
import calendar
from dateutil.relativedelta import *
from pandas.tseries.offsets import *

start = date.datetime(2014,1,1)
end = date.datetime.today()

stock = '^NSEI'
data = web.DataReader(stock, 'yahoo', start, end)
fig , ax = plt.subplots(figsize=(12, 4), dpi =500)

data.plot(y='Close', ax = ax)

这里我省略了一段代码,但产品是:

exceptthursday 
Out[4]: 
                  Day
Date                 
2011-01-26  Wednesday
2011-03-02  Wednesday
2011-04-12    Tuesday
2011-04-22     Friday
2011-08-15     Monday
              ...
2020-05-25     Monday
2020-10-02     Friday
2020-11-16     Monday
2020-11-30     Monday
2020-12-25     Friday

[114 rows x 1 columns]

那么我们有以下代码:

for anotate in (exceptthursday.index + BDay()):
    ax.annotate('holliday', xy=(anotate, data['Close'].loc[anotate]),  xycoords='data',
                xytext=(-30, 40), textcoords='offset points',
                size=13, ha='center', va="baseline",
                bbox=dict(boxstyle="round", alpha=0.1),
                arrowprops=dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1));

当我运行此代码时,我收到以下错误:

KeyError: Timestamp('2011-01-27 00:00:00')

我不知道为什么我会收到此错误,因为 start 是在 2014 年,那么为什么错误是在 2011 年?

【问题讨论】:

  • 您正在传递exceptthursday 的索引以进行迭代。其中包含从 2011-01-26 开始的时间戳。如果我没记错的话,错误一定来自data['Close'].loc[anotate]。因为数据的开始是来自date.datetime(2014,1,1),它没有 2011 年的时间戳
  • @LazyCoder 是的,哥们,你是对的,我的数据有问题。谢谢你的帮助。如果您可以将其发布在答案中,我将奖励赏金并关闭问题。谢谢:)

标签: python python-3.x pandas datetime annotations


【解决方案1】:

您正在传递 exceptthursday's 索引以进行迭代。其中包含开始的时间戳 来自 2011-01-26。 错误必须进来 data['Close'].loc[anotate]。 如果我没记错的话。因为数据的开始是 date.datetime(2014,1,1) 没有 2011 的时间戳

很高兴为您提供帮助。祝您编码愉快!:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 2020-02-04
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多