2011-06-10 90 views
4

我正在使用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 

这听起来确定我:)

+0

是在正确的格式始终日期? AAAA/MM/DD hh:mm:ss – 2011-06-10 02:37:36

+0

是的,日期已经排序YYYY-MM-DD – 2011-06-10 04:28:49

回答

6

阅读多一点谨慎文档字符串:)

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() 

enter image description here

+1

冠军,谢谢 – 2011-06-11 00:50:32

2

好像你传递一个浮动。在您提供的错误消息中(请在下次请提供完整消息!)看来,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 

因此,也许它窒息浮动。

+0

我想我应该更好地解释这个问题,让我编辑 – 2011-06-10 04:45:42

0

我觉得你的问题是在这里:

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第一。

+0

我使用matplotlib 1.0.1和nump 1.6 .0,让我编辑问题更清晰 – 2011-06-10 04:46:05

+0

但如果我添加skiprows我不会在我的记录数组中的字段名称? – 2011-06-10 05:07:15

+0

@Julz看起来你是对的。我没有意识到process_skiprows是在2003和2129行被调用的。 – cwallenpoole 2011-06-10 06:31:31

相关问题