如何从pandas数据帧中提取日期索引以在matplotlib中用作x轴

时间:2013-03-07 03:24:09

标签: matplotlib pandas

我试图在pandas数据框中绘制数据,使用索引(日期和时间)作为x轴,将数据框中的其余数据作为实际数据。以下是我现在正在尝试的内容:

from matplotlib.finance import candlestick2

bars[['open','high','low','close']].head()


tickdatetime         open        high        low         close          

2012-09-20 09:00:00  1447.50     1447.50     1447.00     1447.00

2012-09-20 09:01:00  1447.00     1447.25     1447.00     1447.25

2012-09-20 09:02:00  1447.25     1447.75     1447.25     1447.50

2012-09-20 09:03:00  1447.75     1447.75     1447.25     1447.50

2012-09-20 09:04:00  1447.25     1447.50     1447.25     1447.50

fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
ax.autoscale_view()
linecol, rectcol =  candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown''r',alpha=1) 
z  = rectcol.get_zorder()
linecol.set_zorder(0.9*z)

但是我收到了这个错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-57-d62385067ceb> in <module>()
1 fig,ax = plt.subplots()
----> 2 ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
3 
4 #ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
5 ax.autoscale_view()

AttributeError: '_NDFrameIndexer' object has no attribute 'to_pydatetime'

据我所知,bars.plot()是一个很好的自动处理它的界面,但我希望能够做一些像使用烛台2,更多子图等的东西。

我认为问题的根源只是试图从数据框中获取索引值,并将索引值转换为日期时间,但我还没有能够做到这一点。

感谢任何想法!

1 个答案:

答案 0 :(得分:5)

正如Chang She所说,bars.index是你想要的,而不是bars.ixbars.index返回一个Index对象,该对象本质上是带有索引的Series。这就是你想要的。 bars.ix返回一个_NDFrameIndexer,这看起来很难记录,但它是整个DataFrame的某种视图(例如,try bars.ix[2])。

在代码中用bars.index替换bars.ix将删除错误(如果你还删除了造成无法匹配的错误'),并在前两个子图上做日期标记。但是,值得注意的是它不会在你的烛台图上做日期标记:你的代码不会这样做,虽然使用bars.index它肯定可以毫不费力地完成。

但是,如果你想在烛台2上绘制日期标记,那就更难了。这里的问题是烛台2,你可以通过输入它看到的东西,根本不使用x轴值。它将烛台绘制在0,1,2 ......等等。如果你试图用你的日期设置你的x轴,无论是刻度还是限制,那么一切都会搞砸,因为你的情节将在x轴上完全不同。

解决此问题的一种简单方法是不使用烛台而不是烛台2,让x轴保持为数据的整数索引,而是设置基于标签的刻度线在你的约会。所以,例如:

fig = figure() 
ax = fig.add_subplot(111) 
candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown='r',alpha=1)
ax.set_xticks(arange(0,len(bars))) 
ax.set_xticklabels(bars.index,rotation=70)

这会绘制您的日期,(a)确保您的刻度位于整数位置,然后根据日期设置这些刻度的标签。我也旋转了它们,你可以真正看到它们。 ax.set_xticklabels接受字符串,因此您可以根据需要修改日期格式。