date2num,ValueError:ordinal必须> = 1

Fin*_*ist 4 python numpy matplotlib

我正在使用matplotlib烛台模块,它需要时间作为浮动日格式传递.我之前使用date2num进行转换:

这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

(这是csv文件:http://db.tt/MIOqFA0)

这就是文档所说的:

烛台(AX,报价,宽度= 0.20000000000000001,colorup = 'K',colordown = 'R',α-= 1.0)报价是(时间,打开,关闭,高,低,...)元组的列表.只要元组的前5个元素是这些值,元组可以是您想要的长度(例如它可以存储音量).时间必须是浮动日格式 - 请参阅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
Run Code Online (Sandbox Code Playgroud)

如果我跑得快:

for x in r['date']:
    print str(x) + "is :" + str(date2num(x))
Run Code Online (Sandbox Code Playgroud)

它输出如下:

2010-06-12is :733935.0
2010-07-12is :733965.0
2010-08-12is :733996.0
Run Code Online (Sandbox Code Playgroud)

哪个听起来不错:)

Joe*_*ton 6

仔细阅读文档字符串:)

引号是(时间,开放,关闭,高,低......)元组的列表.

发生的事情是它期望每个项目都是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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述