Matplotlib日期时间格式化

3

我正在绘制一个蜡烛图(OHLC+成交量),不幸的是我无法找出如何以日期时间格式显示日期。尝试了几种方法都没有成功。

import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc
from matplotlib import style
import pandas as pd

style.use('classic')

def graph(candlestick_list):
    df = pd.DataFrame(candlestick_list)
    ohlc = df[['date', 'open', 'high', 'low', 'close']]

    ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
    ax2 = plt.subplot2grid((6,1), (5,0), rowspan=5, colspan=1, sharex=ax1)
    candlestick_ohlc(ax1, ohlc.values, width=0.5, colorup='g', colordown='r')
    ax2.bar(df['date'], df['volume'])
    plt.show()

不幸的是,以下方法对我没有起作用:

df['date'] = pd.to_datetime(df['date'], unit='s')

TypeError:对于“ -”不支持操作数类型:“Timestamp”和“ float”

或者这个:

import matplotlib.dates as mdates
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

ValueError: 年份 4095909 超出范围

有人有什么想法吗? 提前感谢您!

PS:以下列表可用于测试代码

candlestick_list = [{'date': 1496332800, 'high': 215.3209, 'low': 200.3, 'open': 211.18, 'close': 206.47999999, 'volume': 2432435.9201853, 'quoteVolume': 11813.26856836, 'weightedAverage': 205.90710404}, {'date': 1496340000, 'high': 212.0001, 'low': 205.75400533, 'open': 206.47999992, 'close': 207.85, 'volume': 1301024.6514137, 'quoteVolume': 6250.47612412, 'weightedAverage': 208.14808753}, {'date': 1496347200, 'high': 212.44999999, 'low': 206.9813717, 'open': 208.49981874, 'close': 209.99811003, 'volume': 1062083.1773221, 'quoteVolume': 5056.26107738, 'weightedAverage': 210.05307302}, {'date': 1496354400, 'high': 213.20999999, 'low': 209.61231001, 'open': 210, 'close': 211.44, 'volume': 705968.23009208, 'quoteVolume': 3335.35026592, 'weightedAverage': 211.66239639}, {'date': 1496361600, 'high': 219, 'low': 210.81410968, 'open': 211.43999994, 'close': 215.41715998, 'volume': 972040.25543603, 'quoteVolume': 4500.001815, 'weightedAverage': 216.00885852}]

2
抱歉,df['date'] = pd.to_datetime(df['date'], unit='s') 运行良好,它可以正确更改您的列数据类型。至于其他行,我不知道 mdates 或 mticker 是什么,所以无法检查 ^^' - Rayhane Mama
df['date'] = pd.to_datetime(df['date'], unit='s') 对我也适用。 - Nipun Batra
奇怪...我使用的是Python 3.6matplotlib 2.0.2pandas 0.18.1,你呢? - sunwarr10r
1个回答

5

尝试将日期转换为Matplotlib格式。通常,Matplotlib会识别并自动从DataFrames中转换日期,但也有许多奇怪的情况。当事情不起作用时,一般请手动进行转换。

import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc
from matplotlib import style
import pandas as pd
import matplotlib.dates as mdates

def graph(candlestick_list):
    df = pd.DataFrame(candlestick_list)
    df['date'] = pd.to_datetime(df['date'], unit='s')
    df['mdate'] = [mdates.date2num(d) for d in df['date']]

    ohlc = df[['mdate', 'open', 'high', 'low', 'close']]

    ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
    ax2 = plt.subplot2grid((6,1), (5,0), rowspan=5, colspan=1, sharex=ax1)
    candlestick_ohlc(ax1, ohlc.values, width=0.05, colorup='g', colordown='r')
    ax2.bar(df['mdate'], df['volume'])
    ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    plt.xticks(rotation=60)
    plt.show()
date2num()的文档。请注意,我添加了一个单独的mdate列。这对于调试很有用,如果您需要在其他地方使用常规Pandas日期也很有用。在此限制的函数上下文中,可能过度保留几个日期表示形式。 我还缩小了OHLC条的宽度,并旋转了日期刻度,以便更好地查看它们。在这种样式调整上,可能因人而异。 最后,如果列表推导式的使用让您感到不适,因为“它不是矢量化的”,则可以一次完成对matplotlib样式日期的转换:
df['mdate'] = mdates.date2num(df.date.dt.to_pydatetime())

谢谢。当我创建一个新的数据框时,df['date_ts'] = pd.to_datetime(df['date'], unit='s'),然后进行mdates转换,否则candlestick_ohlc()无法使用mdates。但现在出现了一个新的错误:ValueError: DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date() - 我已经执行了ax1.xaxis_date(),但它仍然不起作用。 - sunwarr10r
1
如果你提供一个数据集,我会帮你看一下,看看问题在哪里。 - Jonathan Eunice
1
我刚刚偶然看到了这篇文章,想要补充一下,matplotlib.finance已经不存在了。现在应该使用mpl_finance代替它。(from mpl_finance import candlestick_ohlc - parrott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接