Функция matplotlib.pyplot plot_date разбивается на объекты cftime.datetime - PullRequest
1 голос
/ 16 апреля 2020

При попытке построить данные с помощью функции matplotlib.pyplot.plot_date с объектами datetime, происходящими из функции netCDF4.num2date, я получаю следующую ошибку:

In [1]: from netCDF4 import num2date

In [2]: from matplotlib.pyplot import plot_date

In [3]: d=num2date((86400,2*86400),"seconds since 2000-01-01")

In [4]: gca().plot_date(d,(0,1))
...
AttributeError: 'cftime._cftime.DatetimeGregorian' object has no attribute 'toordinal'

The above exception was the direct cause of the following exception:
ConversionError
...
ConversionError: Failed to convert value(s) to axis units: array([cftime.DatetimeGregorian(2000-01-02 00:00:00),
       cftime.DatetimeGregorian(2000-01-03 00:00:00)], dtype=object)

Установлены следующие версии пакета:

pandas 1.0.3

matplotlib 3.2.1

netcdf4 1.5.1.2

cftime 1.1.1.2

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

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

тоже не помогло.

Любые предложения приветствуются;)

1 Ответ

1 голос
/ 16 апреля 2020

Сам нашел ответ, с версии 1.1.0 функция num2date в пакете cftime изменила свое поведение по умолчанию, возвращая экземпляры cftime datetime вместо python экземпляров datetime, где это возможно (аргумент опции only_use_cftime_datetimes теперь *) 1003 * по умолчанию вместо False). Однако функция plot_date, по крайней мере, в настоящее время, не обрабатывает их. Чтобы избежать проблемы, используйте аргументы only_use_cftime_dateimes=False и only_use_python_datetime=True или вспомогательную функцию num2pydate.

...