Pandas DatetimeIndex от MongoDB ISODate

Мне сложно работать со временем / часовыми поясами. У меня есть исходные данные JSON формы

{ "Date": "28 Sep 2009 00:00:00", .... } 

Эти данные затем загружаются в MongoDB, и это строковое представление даты преобразуется в объект JavaScript Date . Это преобразование в UTC приводит к следующей дате

 { "_id": ObjectId("577a788f4439e17afd4e21f7"), "Date": ISODate("2009-09-27T23:00:00Z") } 

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

Затем я прочитал эти данные у MongoDB и использовал его для создания pandas DatetimeIndex

 idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D') 

который дает мне

введите описание изображения здесь

что неверно, поскольку время не было правильно преобразовано с UTC на местное время. Поэтому я последовал за решением, данным в этом ответе

 idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D') idx = idx.tz_localize(tz=tz.tzutc()) idx = idx.tz_convert(tz=tz.tzlocal()) frame = DataFrame(test_docs, index=idx) frame = frame.drop('Date', 1) 

который дает мне правильный день назад

введите описание изображения здесь

Затем я нормализую DatetimeIndex, поэтому часы удаляются, что позволяет мне группировать все записи в день.

 frame.groupby(idx).sum() 

На данный момент, однако, происходит что-то странное. Даты в конечном итоге группируются следующим образом

введите описание изображения здесь

но это не отражает даты в кадре

введите описание изображения здесь

Может ли кто-нибудь пролить свет на то, где я могу ошибиться?


Ответ на @ptrj

Явно использую мой часовой пояс в виде строки

 idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D') idx = idx.tz_localize(tz=tz.tzutc()) idx = idx.tz_convert(tz='Europe/Dublin') idx = idx.normalize() frame = DataFrame(test_docs, index=idx) ... ... aggregate = frame.groupby(idx).sum() aggregate.plot() 

это не работает для меня, это приводит к следующему графику

введите описание изображения здесь

По какой-то причине groupby неправильно группируется в 2014 году, как показано ниже

введите описание изображения здесь

Если вместо этого я использую

 idx = idx.tz_convert(tz.gettz('Europe/Dublin')) 

У меня такая же проблема

Преобразование в объект

 idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D') idx = idx.tz_localize(tz=tz.tzutc()) idx = idx.tz_convert(tz=tz.tzlocal()) idx = idx.normalize() frame = DataFrame(test_docs, index=idx) aggregate = frame.groupby(idx.astype(object)).sum() 

Этот подход, похоже, работает правильно для меня

введите описание изображения здесь

2 Solutions collect form web for “Pandas DatetimeIndex от MongoDB ISODate”

Я смог воспроизвести ошибку со следующими данными:

 idx0 = pd.date_range('2011-11-11', periods=4) idx1 = idx0.tz_localize(tz.tzutc()) idx2 = idx1.tz_convert(tz.tzlocal()) df = pd.DataFrame([1, 2, 3, 4]) df.groupby(idx2).sum() Out[20]: 0 1970-01-01 00:00:00-05:00 9 2011-11-10 19:00:00-05:00 1 

Это ошибка в коде pandas, связанная исключительно с tz.tzlocal() . Это проявляется также в:

 idx2.tz_localize(None) Out[27]: DatetimeIndex(['2011-11-10 19:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00', '1970-01-01 00:00:00'], dtype='datetime64[ns]', freq='D') 

Вы можете использовать любое из следующих решений:

  • используйте явно часовой пояс в виде строки:

     idx2 = idx1.tz_convert(tz='Europe/Dublin') df.groupby(idx2).sum() Out[29]: 0 2011-11-11 00:00:00+00:00 1 2011-11-12 00:00:00+00:00 2 2011-11-13 00:00:00+00:00 3 2011-11-14 00:00:00+00:00 4 

    или если он не работает:

     idx2 = idx1.tz_convert(tz.gettz('Europe/Dublin')) 
  • преобразовать его в объект:

     df.groupby(idx2.astype(object)).sum() Out[32]: 0 2011-11-10 19:00:00-05:00 1 2011-11-11 19:00:00-05:00 2 2011-11-12 19:00:00-05:00 3 2011-11-13 19:00:00-05:00 4 

В принципе, нужно работать с чем-то еще, чем с DatetimeIndex с tz=tz.local() .


EDIT: эта ошибка была исправлена ​​только в pandas github. Исправление будет доступно в выпуске pandas 0.19.

Мне удалось обойти это сейчас, изменив мою groupby на следующие

 frame.groupby([pd.DatetimeIndex([x.date() for x in frame.index])]).sum() 

поэтому, когда я изначально пытался groupby

 idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D') idx = idx.tz_localize(tz=tz.tzutc()) idx = idx.tz_convert(tz=tz.tzlocal()) frame.groupby(idx).sum() 

Теперь я groupby метод date для каждого элемента индекса перед выполнением операции groupby .

Я отправляю это как ответ, если никто не отвечает, но я надеюсь, что кто-то ответит и объяснит, что происходит, так как мое «решение» кажется слишком хриплым для моих вкусов.

  • Python: исправление локального времени в метке времени
  • Невозможно преобразовать «00:30 AM» в 24 часа с помощью strptime python
  • Манипуляции столбцами с датами-пандами
  • Как ускорить выбор страниц с urllib2 в python?
  • Способ почти правильно запускать функцию периодически
  • Как получить текущее время в python и разбить на год, месяц, день, час, минуту?
  • Python - время.time () против времени bash
  • Почему добавление или удаление из середины коллекции.deque происходит медленнее, чем поиск там?
  •  
    Interesting Posts for Van-Lav

    pandas: установка последних N строк мультииндекса на Nan для ускорения группировки со сдвигом

    Что такое протоколы итератора, итерации и итерации Python?

    IDE PEcharm пытается загрузить сценарий django из sh вместо bash

    MySQL-Python & Django 1.5.0: нет модуля с именем mysql.base error

    Как я могу заставить программу python проверять службы linux?

    Почему кнопка сохранения не работает на графике matplotlib?

    Как работать с интерактивно определенными классами в IPython.parallel?

    Python, что это означает? Объект AttributeError: 'unicode' не имеет атрибута 'has_key'

    Numba: ячейки не поддерживаются

    python: получить абстрактное синтаксическое дерево импортируемой функции?

    Разделить строку при n-м вхождении заданного символа

    Почему экземпляры экземпляров старого стиля класса «объект»?

    Чтение метаданных SHOUTcast / Icecast из радиопотока с помощью Python

    Как подобрать подстрочные группы и переменные в Python

    Имена переменных, которые следует избегать в Python

    Python - лучший язык программирования в мире.