提问人:Rahul Shah 提问时间:11/15/2023 最后编辑:Trenton McKinneyRahul Shah 更新时间:11/15/2023 访问量:53
使用 mpf.plot 绘制时区感知日期时间(通过 pd.read_csv加载)时发生 TypeError
TypeError occurs when plotting timezone-aware datetimes, loaded via pd.read_csv, with mpf.plot
问:
我有我想玩的股票数据,我想我会用 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),我对如何清理日期,如何找到坏行(如果有的话)有点困惑。
任何帮助将不胜感激。我不知道这是我的代码还是我的数据。我被引导相信这是我的数据,但这是我第一次弄乱这些东西,所以我不知道。
答:
0赞
Trenton McKinney
11/15/2023
#1
- 可以通过在加载 csv 后设置列格式来解决此问题。
'Datetime'
df = pd.read_csv('aapl.csv', index_col='Datetime')
df.index = pd.to_datetime(df.index, utc=True)
Timestamp('2023-01-03 14:30:00+0000', tz='UTC')
是生成的格式,它确实适用于mpf.plot(df)
- 从yfinance下载数据时,指数值如下:
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.9b7
、yfinance v0.2.31
、matplotlib 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')
- 请注意,using 会设置一个特定的 with ,在笔记本环境发生更改之前,它不会恢复。
mpf.plot()
style
matplotlib rcParams
- 绘图也可以直接使用 ,它用作默认后端。
pandas.DataFrame.plot
matplotlib
- 但是,不能使用其他功能。
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
- 标准格式
pandas.DataFrame.plot
评论