matplotlib 蜡烛图错误 xy = (t-OFFSET, lower),TypeError: 不支持的操作数类型: 'datetime.date' 和 'float

1 投票
1 回答
2411 浏览
提问于 2025-04-18 16:42

我正在尝试使用matplotlib绘制一个蜡烛图。我已经从数据库查询了相关数据,并将其以所需的格式(日期、开盘价、收盘价、最高价、最低价)添加到一个名为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'

当我打印出我的candleAr时,得到的结果是这样的(我只包含了前几个结果作为示例):

[(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导入的蜡烛图功能应该能处理日期时间和浮点数吧?我想,除了日期/日期时间和浮点数,还有什么可以传递给它来构建与价格和日期相关的图表呢?

有没有人能指出我哪里做错了?

1 个回答

5

Matplotlib使用浮点数来表示日期,这些数字是从公元0001年1月1日开始计算的天数,带小数点的部分表示一天中的小部分。

这个内容在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()来获取一个浮点数,而不是整数。

撰写回答