2011-06-10 93 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

相關問題