Почему я получаю ошибки "python int too large to convert to C long", когда я использую DateFormatter matplotlib для форматирования дат на оси x?

после этот ответ использует DateFormatter, Я попытался построить временной ряд и обозначить его ось x годами, используя pandas 0.15.0 и matplotlib 1.4.2:

import datetime as dt
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas.io.data as pdio
import scipy as sp

t1 = dt.datetime(1960, 1, 1)
t2 = dt.datetime(2014, 6, 1)
data = pdio.DataReader("GS10", "fred", t1, t2).resample("Q", how=sp.mean)

fig, ax1 = plt.subplots()
ax1.plot(data.index, data.GS10)
ax1.set_xlabel("Year")
ax1.set_ylabel("Rate (%)")
ax1.xaxis.set_major_formatter(mpl.dates.DateFormatter("%Y"))
fig.suptitle("10-yr Treasury Rate", fontsize=14)

fig.savefig('test.eps')

последняя строка выдает ошибку: OverflowError: Python int too large to convert to C long этот вывод:

C:Anaconda3libsite-packagesIPythoncoreformatters.py:239: FormatterWarning: исключение в формате изображения/png: Python int тоже большой для преобразования в C long FormatterWarning, Обратная трассировка (самый последний вызов последний):

файл"", строка 1, in runfile('D:/username/latex_template/new_pandas_example.py', wdir='D:/username/latex_template')

"C:Anaconda3libsite-packagesspyderlibwidgetsexternalshellsitecustomize.py", строка 580, в runfile execfile (имя файла, пространство имен) "C:Anaconda3libsite-packagesspyderlibwidgetsexternalshellsitecustomize.py", строка 48 в execfile exec(compile(open (filename, 'rb').read (), filename, 'exec'), namespace)

файл "D:/username/latex_template/new_pandas_example.py", строка 18, в инжир.тест savefig ('.eps')

файл "C:Anaconda3libsite-packagesmatplotlibfigure.py", линия 1470, в savefig личность.холст.print_figure (*args, * * kwargs)

Файл "C:Anaconda3libsite-packagesmatplotlibbackend_bases.py", строка 2194, в print_figure **kwargs)

"C:Anaconda3libsite-packagesmatplotlibbackendsbackend_ps.py", строка 992, в print_eps верните себя._print_ps (outfile, 'eps', *args, **kwargs) "C:Anaconda3libsite-packagesmatplotlibbackendsbackend_ps.py", строка 1020, in _print_ps **kwargs) "C:Anaconda3libsite-packagesmatplotlibbackendsbackend_ps.py", строка 1110, in _print_figure личность.фигура.draw (визуализатор) "C:Anaconda3libsite-packagesmatplotlibartist.py", строка 59, в draw_wrapper draw (художник, визуализатор, *args, **kwargs)

файл "C:Anaconda3libsite-packagesmatplotlibfigure.py", линия 1079, в розыгрыше Функ(*параметр args)

файл "C:Anaconda3libsite-packagesmatplotlibartist.py", строка 59, в draw_wrapper draw (художник, визуализатор, *args, **kwargs)

файл "C:Anaconda3libsite-packagesmatplotlibaxes_base.py", линия Две тысячи девяносто два, в розыгрыше а.рисовать(визуализации)

файл "C:Anaconda3libsite-packagesmatplotlibartist.py", строка 59, в draw_wrapper draw (художник, визуализатор, *args, **kwargs)

файл "C:Anaconda3libsite-packagesmatplotlibaxis.py", строка 1114, в розыгрыше ticks_to_draw = self._update_ticks (renderer)

файл "C:Anaconda3libsite-packagesmatplotlibaxis.py", строка 957, в _update_ticks tick_tups = [t для t в личность.iter_ticks()]

файл "C:Anaconda3libsite-packagesmatplotlibaxis.py", строка 957, в tick_tups = [t для t в self.iter_ticks()]

файл "C:Anaconda3libsite-packagesmatplotlibaxis.py", линия 905, в iter_ticks для i, val в перечислении (majorLocs)]

файл "C:Anaconda3libsite-packagesmatplotlibaxis.py", линия 905, в для i, val в перечислении (majorLocs)]

"C:Anaconda3libsite-packagesmatplotlibdates.py", строка 411, в вызов dt = num2date (x, self.tz)

файл "C:Anaconda3libsite-packagesmatplotlibdates.py", строка 345, в num2date return _from_ordinalf (x, tz)

файл "C:Anaconda3libsite-packagesmatplotlibdates.py", строка 225, in _from_ordinalf ДТ = датавремя.значение datetime.fromordinal (ix)

OverflowError: Python int слишком велик для преобразования в C долго

Я использую DateFormatter неправильно здесь? Как я могу легко поместить годы (или любой формат времени, так как мои временные ряды могут отличаться) на ось a фигуры matplotlib?

1 ответов


это "регрессия" в pandas 0.15 (из-за рефактора индекса), см. https://github.com/matplotlib/matplotlib/issues/3727 и https://github.com/pydata/pandas/issues/8614, но исправлено в 0.15.1.


короткий рассказ: matplotlib теперь видит индекс панды как массив datetime64[ns] значения (которые на самом деле очень большие int64s), а не массив временных меток (которые являются подклассом datetime.datetime, и может быть обрабатывается matplotlib) в предыдущих версиях pandas. Таким образом, основная причина заключается в том, что matplotlib обрабатывает datetime64 не как значения даты, а как ints.

для панд 0.15.0 (но лучше обновить до более новой версии), есть два возможных решения:

  • зарегистрировать datetime64 type, поэтому он также будет обрабатываться как дата matplotlib:

    units.registry[np.datetime64] = pd.tseries.converter.DatetimeConverter()
    
  • или преобразовать DatetimeIndex (с помощью datetime64 значения) в массив datetime.datetime значения to_pydatetime метод, и сюжет этот:

    ax1.plot(data.index.to_pydatetime(), data.GS10)
    

вопрос: построение графика datetimeindex на оси x с помощью matplotlib создает неправильные Тики в панд 0.15 в отличие от 0.14