ТипError: формат% d: требуется номер, а не numpy.float64

Пытаясь matplotlib , я получил следующую ошибку от matplotlib :

 TypeError: %d format: a number is required, not numpy.float64 

Это полная трассировка (я изменил имена путей):

 Traceback (most recent call last): File ".../plotmod.py", line 154, in _plot fig.autofmt_xdate() File ".../local/lib/python2.7/site-packages/matplotlib/figure.py", line 426, in autofmt_xdate for label in ax.get_xticklabels(): File ".../local/lib/python2.7/site-packages/matplotlib/axes.py", line 2620, in get_xticklabels self.xaxis.get_ticklabels(minor=minor)) File ".../local/lib/python2.7/site-packages/matplotlib/axis.py", line 1118, in get_ticklabels return self.get_majorticklabels() File ".../local/lib/python2.7/site-packages/matplotlib/axis.py", line 1102, in get_majorticklabels ticks = self.get_major_ticks() File ".../local/lib/python2.7/site-packages/matplotlib/axis.py", line 1201, in get_major_ticks numticks = len(self.get_major_locator()()) File ".../local/lib/python2.7/site-packages/matplotlib/dates.py", line 595, in __call__ 'RRuleLocator estimated to generate %d ticks from %s to %s: exceeds Locator.MAXTICKS * 2 (%d) ' % (estimate, dmin, dmax, self.MAXTICKS * 2)) TypeError: %d format: a number is required, not numpy.float64 

Откуда эта ошибка?

Некоторые фундаментальные исследования я сделал результаты:

  • ошибка не является реальной ошибкой, а вместо того, которая возникает при попытке форматировать сообщение matplotlib.dates , matplotlib.dates создает matplotlib.dates
  • ошибка форматирования была вызвана %d python, которая, кажется, не может обрабатывать экземпляры numpy.float64
  • экземпляр, содержащий этот тип данных, является либо estimate , которая является некоторым внутренним результатом вычисления matplotlib , либо MAXTICKS , который, вероятно, является константой, поэтому я склонен считать, что это первый вариант
  • вычисление estimate включает date2num который должен возвращать законные значения, и _get_unit() и _get_interval() , которые проникают достаточно глубоко в модуль, и именно здесь мое исследование прекращается.

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

Есть предположения?

Кажется, у вас есть NaN или бесконечность, которую вы пытаетесь отформатировать как целое число, которое вызывает ошибку (нет такой вещи, как NaN или Inf для типа int).

 In [1]: import numpy as np In [2]: '%d' % np.float64(42) Out[2]: '42' In [3]: '%d' % np.float64('nan') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython console> in <module>() TypeError: %d format: a number is required, not numpy.float64 In [4]: '%d' % np.float64('inf') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ipython console> in <module>() TypeError: %d format: a number is required, not numpy.float64 

Вы можете зайти в файл matplotlib (или использовать отладчик python), который генерирует ошибку и меняет строку печати на %f которая будет работать со всеми поплавками numpy. ( '%f' % np.float64('nan') возвращает 'nan' ).

Преобразование numpy float в Python поплавок вручную.

 np.asscalar(np.float64(42))