1

我正在尝试使用 matplotplib 绘制烛台图。我已经查询了我的数据库,返回了相关数据,并以所需的格式(日期、打开、关闭、高、低)附加到名为 candleAr 的数组中

我的代码如下:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
from matplotlib.finance import candlestick


candleAr=[]

cursor = conx.cursor()
query= 'SELECT ticker,date,time,open,low,high,close FROM eurusd WHERE date > "2013-02-28"'
cursor.execute(query)
for line in cursor:
    #appendLine in correct format for candlesticks - date,open,close,high,low
    appendLine = line[1],line[3],line[6],line[5],line[4]
    candleAr.append(appendLine)


fig = plt.figure()
ax1 = plt.subplot(1,1,1)
candlestick(ax1, candleAr, width=1, colorup='g', colordown='r')

ax1.grid(True)


plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

但是我收到以下错误消息:

Traceback (most recent call last):
  File "C:\Users\Stuart\Desktop\Python Programming\Apache\Liclipse\Andres-Apache\FX\fx2.py", line 53, in <module>
candlestick(ax1, candleAr, width=1, colorup='g', colordown='r')
  File "C:\Users\Stuart\AppData\Local\Enthought\Canopy32\User\lib\site-packages\matplotlib\finance.py", line 359, in candlestick
xy    = (t-OFFSET, lower),
TypeError: unsupported operand type(s) for -: 'datetime.date' and 'float'

当我打印出我的蜡烛时,我得到以下信息(我刚刚包含了前几个结果作为示例):

[(datetime.date(2013, 3, 1), 1.306, 1.305, 1.306, 1.305), (datetime.date(2013, 3, 1), 1.305, 1.306, 1.306, 1.305)

因此,毫无疑问,有与错误消息相关的日期时间和浮点数,但从 matplotlib 导入的烛台肯定可以处理日期时间和浮点数 - 我的意思是可以传递给它的其他内容以构建与价格和日期相关的图表,如果不是日期的话/日期时间和浮动!??

谁能指出我做错了什么?

4

1 回答 1

5

Matplotlib 使用浮点数表示序数(从 0001-01-01 开始计算天数),小数表示一天的分数。

这记录在candlestick文档字符串中:

时间必须采用float天格式 - 请参阅date2num

matplotlib.dates模块为您提供了将datetime对象转换为此类数字的工具:

>>> from datetime import date
>>> from matplotlib.dates import date2num
>>> date2num(date(2013, 3, 1))
734928.0

对于您的代码,如下所示:

from matplotlib.dates import date2num

appendLine = date2num(line[1]), line[3], line[6], line[5], line[4]

因为datetime.date()这基本上归结datetime.date.toordinal()为浮点数而不是整数。

于 2014-08-10T00:08:21.233 回答