pandas 0.21.0 Проблема совместимости с меткой времени с помощью matplotlib

Я просто обновил pandas от 0.17.1 до 0.21.0, чтобы воспользоваться некоторыми новыми функциями, и столкнулся с проблемой совместимости с matplotlib (который я также обновил до версии 2.1.0). В частности, объект Timestamp, похоже, значительно изменен.

У меня, похоже, еще одна машина по-прежнему работает с более старыми версиями pandas (0.17.1) / matplotlib (1.5.1), которые я использовал для сравнения различий:

Обе версии показывают мой индекс DataFrame как dtype='datetime64[ns]

 DatetimeIndex(['2017-03-13', '2017-03-14', ... '2017-11-17'], type='datetime64[ns]', name='dates', length=170, freq=None) 

Но при вызове type(df.index[0]) , 0.17.1 дает pandas.tslib.Timestamp и 0.21.0 дает pandas._libs.tslib.Timestamp .

При построении графика с df.index виде оси x:

 plt.plot(df.index, df['data']) 

matplotlibs по умолчанию форматирует метки оси x в качестве дат для pandas 0.17.1, но не может распознать его для pandas 0.21.0 и просто дает исходное число 1.5e18 (эпоха в наносеку).

У меня также есть настраиваемый курсор, который сообщает, что щелкнул местоположение на графике, используя matplotlib.dates.DateFormatter по значению x, которое не работает для 0.21.0:

 OverflowError: signed integer is greater than maximum 

Я могу заметить, что в отладочном отчете значение x составляет около 736500 (т. Е. Количество дней с 0), для 0.17.1, но составляет около 1.5e18 (т.е. время наносекунды) для 0.21.0.

Меня удивляет этот разрыв совместимости между matplotlib и пандами, поскольку они, очевидно, используются вместе большинством людей. Я что-то упускаю из-за того, что я называю функцию сюжета выше для более новых версий?

Как я уже упоминал выше, я предпочитаю прямо вызывать plot с заданным объектом осей, но только для этого, я попытался вызвать метод plot самого df.plot() . Как только это будет сделано, все последующие графики правильно распознают временную метку в рамках той же сессии python . Это как если бы была задана переменная окружения, потому что я могу перезагрузить другой DataFrame или создать другие оси с subplots и нет, где появляется 1.5e18 . Это действительно пахнет как ошибка, поскольку последний pandas doc говорит пандам :

 The plot method on Series and DataFrame is just a simple wrapper around plt.plot() 

Но ясно, что он делает что-то для сеанса python, так что последующие сюжеты правильно относятся к индексу Timestamp.

Фактически, просто запустив пример в приведенной выше ссылке pandas:

 import pandas as pd import numpy as np import matplotlib.pyplot as plt ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 

В зависимости от того, ts.plot() ли ts.plot() или нет, следующий график либо правильно форматирует ось x как даты, либо нет:

 plt.plot(ts.index,ts) plt.show() 

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

2 Solutions collect form web for “pandas 0.21.0 Проблема совместимости с меткой времени с помощью matplotlib”

Существует проблема с датами pandas и matplotlib, полученными из недавнего выпуска pandas 0.21, который больше не регистрирует свои конвертеры при импорте. Как только вы используете эти конвертеры один раз (в пределах панд), они будут зарегистрированы и автоматически будут использоваться matplotlib.

Обходным путем было бы зарегистрировать их вручную,

 import pandas.plotting._converter as pandacnv pandacnv.register() 

В любом случае проблема хорошо известна как на сайтах pandas, так и на matplotlib, поэтому для следующих выпусков будет какое-то исправление. Пандас думает о том, чтобы прочитать регистр в раскрученном выпуске. Поэтому этот вопрос может быть только временно. Опция также должна вернуться к pandas 0.20.x, где это не должно происходить.

Обновление: это уже не проблема с текущими версиями matplotlib (2.2.2) / pandas (0.23.1) и, вероятно, многие из них были выпущены примерно с 2017 года, когда это было исправлено.

После открытия вопроса о pandas github я узнал, что это действительно известная проблема между пандами и matplotlib в отношении автоматической регистрации конвертера единиц. Фактически, он был указан на новой странице, которую я раньше не видел, а также правильном способе регистрации преобразователей:

 from pandas.tseries import converter converter.register() 

Это также делается в первый раз, когда метод plot-члена вызывается в серии или DataFrame, что объясняет то, что я наблюдал выше.

Похоже, что это сделано с намерением, что matplotlib должен реализовать некоторую базовую поддержку pandas datetime, но действительно предупреждение о некорректности может быть полезно для такого перерыва. Однако до тех пор, пока matplotlib не реализует такую ​​поддержку (или какой-то ленивый механизм регистрации), я практически всегда помещаю эти две строки при импорте pandas. Поэтому я не уверен, почему панды хотели бы отключить автоматическую регистрацию при импорте, прежде чем все будет готово на стороне matplotlib.

  • В чем разница между списками, заключенными в квадратные скобки и круглые скобки в Python?
  • Как обрезать пробелы из строки Python?
  • Как прокручивать два списка параллельно?
  • IPython в Terminal.app: многострочное редактирование
  • `Какой python` указывает на питон, который я хочу, но` python` запускает неправильную версию
  • Требуется Microsoft Visual C ++ 14.0 (невозможно найти vcvarsall.bat)
  • Получение TypeError: __init __ () отсутствует 1 требуемый позиционный аргумент: 'on_delete' при попытке добавить родительскую таблицу после дочерней таблицы с записями
  • Переименование столбцов результатов из агрегации Pandas («FutureWarning: использование dict с переименованием устарело»)
  • Как реализовать __getattribute__ без бесконечной ошибки рекурсии?
  • Безопасный метод Python для получения значения вложенного словаря
  • ValueError: ошибка при проверке цели: ожидаемая модель_2 должна иметь форму (None, 252, 252, 1), но получен массив с формой (300, 128, 128, 3)
  • Interesting Posts

    Командная строка VS2010 дает ошибку: не удается определить местоположение папки VS Common Tools

    Эффект Hover: расширение нижней границы

    Как изменить атрибут заголовка элемента с помощью jQuery

    Visual Studio отлаживает инструмент «быстрого просмотра» и lambda-выражения

    Что делать, если мой USB-накопитель защищен от записи или доступен только для чтения?

    Запуск пакетного файла при запуске

    Динамическое распределение неизвестной матрицы в C

    Как преобразовать String в SecretKey

    Почему CTRL-клик не открывает некоторые ссылки на новой вкладке?

    Табличное представление Javafx не показывает данные во всех столбцах

    MS Word для PDF. Границы поврежденных таблиц

    Windows 10 VPN Connect Button Громоздкий

    Java – Нулевая переменная требует пространства в памяти

    Какое лучшее решение для резервного копирования Ubuntu для нетехнического пользователя?

    Самый простой способ настроить HTTP-прокси-запрос-отправитель в MAC-адресе?

    Давайте будем гением компьютера.