date2num,ValueError:序号必须> = 1
我正在使用matplotlib烛台模块,该模块需要时间作为浮动日格式传递。我真的使用date2num将它转换,前:date2num,ValueError:序号必须> = 1
这是我的代码:
import csv
import sys
import math
import numpy as np
import datetime
from optparse import OptionParser
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import matplotlib.mlab as mlab
import matplotlib.dates as mdates
from matplotlib.finance import candlestick
from matplotlib.dates import date2num
datafile = 'historical_data/AUD_Q10_1D_500.csv'
print 'loading', datafile
r = mlab.csv2rec(datafile, delimiter=';')
quotes = [date2num(r['date']),r['open'],r['close'],r['max'],r['min']]
candlestick(ax, quotes, width=0.6)
plt.show()
(这里是CSV文件:http://db.tt/MIOqFA0)
这是医生说什么:
candlestick(ax, quotes, width=0.20000000000000001, colorup='k', colordown='r', alpha=1.0) quotes is a list of (time, open, close, high, low, ...) tuples. As long as the first 5 elements of the tuples are these values, the tuple can be as long as you want (eg it may store volume). time must be in float days format - see date2num
以下是完整的错误日志:
Traceback (most recent call last):
File
"/usr/lib/python2.6/site-packages/matplotlib/backends/backend_qt4agg.py",
line 83, in paintEvent
FigureCanvasAgg.draw(self) File
"/usr/lib/python2.6/site-packages/matplotlib/backends/backend_agg.py",
line 394, in draw
self.figure.draw(self.renderer) File
"/usr/lib/python2.6/site-packages/matplotlib/artist.py",
line 55, in draw_wrapper draw(artist,
renderer, *args, **kwargs) File
"/usr/lib/python2.6/site-packages/matplotlib/figure.py",
line 798, in draw func(*args) File
"/usr/lib/python2.6/site-packages/matplotlib/artist.py",
line 55, in draw_wrapper draw(artist,
renderer, *args, **kwargs) File
"/usr/lib/python2.6/site-packages/matplotlib/axes.py", line 1946, in draw a.draw(renderer)
File
"/usr/lib/python2.6/site-packages/matplotlib/artist.py",
line 55, in draw_wrapper draw(artist,
renderer, *args, **kwargs) File
"/usr/lib/python2.6/site-packages/matplotlib/axis.py", line 971, in draw tick_tups = [ t for
t in self.iter_ticks()] File
"/usr/lib/python2.6/site-packages/matplotlib/axis.py", line 904, in iter_ticks majorLocs =
self.major.locator() File
"/usr/lib/python2.6/site-packages/matplotlib/dates.py",
line 743, in __call__ self.refresh()
File
"/usr/lib/python2.6/site-packages/matplotlib/dates.py",
line 752, in refresh dmin, dmax =
self.viewlim_to_dt() File
"/usr/lib/python2.6/site-packages/matplotlib/dates.py",
line 524, in viewlim_to_dt return
num2date(vmin, self.tz),
num2date(vmax, self.tz) File
"/usr/lib/python2.6/site-packages/matplotlib/dates.py",
line 289, in num2date if not
cbook.iterable(x): return
_from_ordinalf(x, tz) File "/usr/lib/python2.6/site-packages/matplotlib/dates.py",
line 203, in _from_ordinalf dt =
datetime.datetime.fromordinal(ix)
ValueError: ordinal must be >= 1
如果我运行一个快速:
for x in r['date']:
print str(x) + "is :" + str(date2num(x))
它输出类似:
2010-06-12is :733935.0
2010-07-12is :733965.0
2010-08-12is :733996.0
这听起来确定我:)
阅读多一点谨慎文档字符串:)
quotes is a list of (time, open, close, high, low, ...) tuples.
发生了什么事是,它预计每个项目的quotes
是序列(时间,打开,关闭,高,低)。
您正在传递5个长数组,它需要5个项目的长序列。
您只需输入zip
即可。
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from matplotlib.finance import candlestick
from matplotlib.dates import date2num
datafile = 'Downloads/AUD_Q10_1D_500.csv'
r = mlab.csv2rec(datafile, delimiter=';')
quotes = zip(date2num(r['date']),r['open'],r['close'],r['max'],r['min'])
fig, ax = plt.subplots()
candlestick(ax, quotes, width=0.6)
plt.show()
冠军,谢谢 – 2011-06-11 00:50:32
好像你传递一个浮动。在您提供的错误消息中(请在下次请提供完整消息!)看来,matplotlib只是将转换委托给datetime.datetime.fromordinal
。
我没有Python 3安装来测试这个,但是当我试图在2.6中使用datetime.datetime.fromordinal
将float转换为datetime
对象时,我收到了弃用警告。然后我试图在ideone和得到这个:
Traceback (most recent call last):
File "prog.py", line 2, in <module>
print(datetime.datetime.fromordinal(5.5))
TypeError: integer argument expected, got float
因此,也许它窒息浮动。
我想我应该更好地解释这个问题,让我编辑 – 2011-06-10 04:45:42
我觉得你的问题是在这里:
r = mlab.csv2rec(datafile, delimiter=';')
您需要跳过CSV的第一行,这意味着你需要:
r = mlab.csv2rec(datafile, delimiter=';', skiprows=1)
从技术上讲这是不正确, Ubuntu有一个老版本的库,OP的版本有下面两行,但这是我的原始答案
我会确保你使用的是最新版本的matplotlib。
为了能够重现此问题,我下载并安装了最新版本,并且我注意到有问题的代码的行号已更改为179.我还注意到该值会立即转换为int fromordinal被称为(这给了senderle的答案很多的证据)。
(在Ubuntu仓库最近matplotlib的线178-179)
ix = int(x)
dt = datetime.datetime.fromordinal(ix)
如果升级是不是一种选择,那么你应该转换为int第一。
我使用matplotlib 1.0.1和nump 1.6 .0,让我编辑问题更清晰 – 2011-06-10 04:46:05
但如果我添加skiprows我不会在我的记录数组中的字段名称? – 2011-06-10 05:07:15
@Julz看起来你是对的。我没有意识到process_skiprows是在2003和2129行被调用的。 – cwallenpoole 2011-06-10 06:31:31
是在正确的格式始终日期? AAAA/MM/DD hh:mm:ss – 2011-06-10 02:37:36
是的,日期已经排序YYYY-MM-DD – 2011-06-10 04:28:49