date2num, ValueError: порядковый номер должен быть> = 1 - PullRequest
4 голосов
/ 10 июня 2011

Я использую модуль подсвечника 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()

(вот файл csv: http://db.tt/MIOqFA0)

Вот что говорит доктор:

подсвечник (топор, кавычки, ширина = 0.20000000000000001, colorup = 'k', colordown = 'r', alpha = 1.0) цитатыэто список (time, open, close, high, low, ...) кортежей.Пока первые 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

Если я запускаю быстро:

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

, что звучит нормально для меня:)

Ответы [ 3 ]

6 голосов
/ 10 июня 2011

Прочитайте строку документации немного более внимательно:)

цитаты - это список (time, open, close, high, low, ...) кортежей.

Что происходит, так это то, что каждый элемент из 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

2 голосов
/ 10 июня 2011

Похоже, вы передаете его поплавком. И в сообщении об ошибке (полное сообщение в следующий раз, пожалуйста!) Появляется сообщение о том, что matplotlib просто делегирует преобразование в datetime.datetime.fromordinal.

У меня нет установки Python 3 для проверки этого, но когда я попытался преобразовать float в datetime объект, используя datetime.datetime.fromordinal в 2.6, я получил предупреждение об устаревании. Тогда я попробовал это на 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 голосов
/ 10 июня 2011

Я думаю, что ваша проблема здесь:

r = mlab.csv2rec(datafile, delimiter=';')

Вам нужно пропустить первую строку CSV, что означает, что вам нужно:

r = mlab.csv2rec(datafile, delimiter=';', skiprows=1)

Технически это неверно, Ubuntu имеет более старую версию библиотеки, а версия OP содержит две строки ниже, но это был мой первоначальный ответ

Я бы хотел убедиться, что вы используете самую последнюю версию matplotlib.

Чтобы я мог воспроизвести эту проблему, я скачал и установил последнюю версию и заметил, что номер строки нарушающего кода был изменен на 179. Я также заметил, что значение приводится к int непосредственно перед fromordinal называется (это придает большое значение ответу отправителя).

(строка 178-179 самого последнего пакета matplotlib в хранилище Ubuntu)

ix = int(x)
dt = datetime.datetime.fromordinal(ix)

Если обновление не вариант, то сначала вы должны привести к int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...