使用 mpf.plot 绘制时区感知日期时间(通过 pd.read_csv加载)时发生 TypeError

TypeError occurs when plotting timezone-aware datetimes, loaded via pd.read_csv, with mpf.plot

提问人:Rahul Shah 提问时间:11/15/2023 最后编辑:Trenton McKinneyRahul Shah 更新时间:11/15/2023 访问量:53

问:

我有我想玩的股票数据,我想我会用 mpl 绘制它。这是我尝试过的:

daily = pd.read_csv('data/AAPL/history.csv',index_col=0,parse_dates=True)
mpf.plot(daily)

这将返回

TypeError: Expect data.index as DatetimeIndex

然后我按照文档尝试了这个

daily = pd.read_csv('data/AAPL/history.csv',index_col=0,parse_dates=True)
daily.index.name = 'Date'
mpf.plot(daily)

这会产生相同的错误。

然后我尝试设置索引:

daily = pd.read_csv('data/AAPL/history.csv',index_col=0,parse_dates=True)
daily.index = pd.DatetimeIndex(daily['Date'])
mpf.plot(daily)

出现以下错误:

KeyError: 'Date'

尝试执行相同的操作,但不设置索引:

daily = pd.read_csv('data/AAPL/history.csv')
daily.index = pd.DatetimeIndex(daily['Date'])
mpf.plot(daily)

返回:

TypeError: [datetime.datetime(1980, 12, 12, 0, 0, tzinfo=tzoffset(None, -18000))
 datetime.datetime(1980, 12, 15, 0, 0, tzinfo=tzoffset(None, -18000))
 datetime.datetime(1980, 12, 16, 0, 0, tzinfo=tzoffset(None, -18000)) ...
 datetime.datetime(2023, 11, 10, 0, 0, tzinfo=tzoffset(None, -18000))
 datetime.datetime(2023, 11, 13, 0, 0, tzinfo=tzoffset(None, -18000))
 datetime.datetime(2023, 11, 14, 0, 0, tzinfo=tzoffset(None, -18000))]

这让我相信其中一行的格式不正确。我从yfinance上得到了这些数据,我只是像你所期望的那样阅读它。但是由于行数如此之大(10,823),我对如何清理日期,如何找到坏行(如果有的话)有点困惑。

任何帮助将不胜感激。我不知道这是我的代码还是我的数据。我被引导相信这是我的数据,但这是我第一次弄乱这些东西,所以我不知道。

python datetime typeerror 雅虎财 经 mplfinance yfinance

评论


答:

0赞 Trenton McKinney 11/15/2023 #1
  • 可以通过在加载 csv 后设置列格式来解决此问题。'Datetime'
    1. df = pd.read_csv('aapl.csv', index_col='Datetime')
    2. df.index = pd.to_datetime(df.index, utc=True)
    • Timestamp('2023-01-03 14:30:00+0000', tz='UTC')是生成的格式,它确实适用于mpf.plot(df)
  • 下载数据时,指数值如下:
    • Timestamp('2023-01-03 09:30:00-0500', tz='America/New_York'),它与 .mpf.plot(df)
  • df = pd.read_csv('aapl.csv', index_col='Datetime', parse_dates=['Datetime'])结果是:
    • Timestamp('2023-01-03 09:30:00-0500', tz='UTC-05:00'),它不适用于 。mpf.plot(df)
  • mpf.plot(df)似乎对时区、格式很讲究。tz
  • 在 pandas 中处理时区的其他选项。
  • python v3.12.0、pandas v2.1.2、mplfinance v0.12.9b7yfinance v0.2.31matplotlib v3.8.1 中测试。

从加载数据并绘图 - Worksyfinace

  • Timestamp('2023-01-03 09:30:00-0500', tz='America/New_York')
import pandas as pd
import yfinance as yf  # conda install -c conda-forge yfinance
import mplfinance as mpf  # conda install -c conda-forge mplfinance

# download data from yfinance
tickers = ['aapl']  # this can contain multiple tickers
df = pd.concat((yf.download(ticker, start='2023-01-01', end='2023-11-14', interval='1h').assign(tkr=ticker) for ticker in tickers), ignore_index=False)

# save the dataframe
df.to_csv('aapl.csv')

# plotting works
mpf.plot(df, type='line')

加载 csv 和解析日期 - 绘图不起作用

  • Timestamp('2023-01-03 09:30:00-0500', tz='UTC-05:00')
  • 结果TypeError: Expect data.index as DatetimeIndex
# load the dataframe and parse dates
df = pd.read_csv('aapl.csv', index_col='Datetime', parse_dates=['Datetime'])

# plotting does not work
mpf.plot(df, type='line')

加载 csv,然后解析日期和 绘图 - Worksutc=True

  • Timestamp('2023-01-03 14:30:00+0000', tz='UTC')
# load the file, but don't parse dates
df = pd.read_csv('aapl.csv', index_col='Datetime'

# set datetime format as utc
df.index = pd.to_datetime(df.index, utc=True)

# plotting works
mpf.plot(df, type='line')

enter image description here


  • 请注意,using 会设置一个特定的 with ,在笔记本环境发生更改之前,它不会恢复。mpf.plot()stylematplotlib rcParams
  • 绘图也可以直接使用 ,它用作默认后端。pandas.DataFrame.plotmatplotlib
    • 但是,不能使用其他功能。mplfinance
# load csv and parse the dates
df = pd.read_csv('aapl.csv', index_col='Datetime', parse_dates=['Datetime'])

# plotting with pandas works with this format, while it doesn't with mpf.plot
ax = df.plot(y='Close')
  • 注意,绘图样式如下mpf.plot

enter image description here

  • 标准格式pandas.DataFrame.plot

enter image description here