Преобразование строки временной метки JSON в дату python в кадре данных pandas

У меня есть фрейм данных pandas, который я прочитал из JSON, один столбец даты – это странный формат временной метки, как следует

"/ Дата (1405961743000 + 0100) /"

, Как преобразовать весь столбец в дату python?

Я смог вручную преобразовать эту дату в дату python, используя функцию datetime fromtimestamp на первые 10 цифр, то есть datetime.datetime.fromtimestamp(1405961743) но я изо всех сил datetime.datetime.fromtimestamp(1405961743) преобразовать весь столбец.

Я предполагаю, что мне нужно выбрать соответствующие цифры из каждой записи, конвертировать в целое число, а затем использовать функцию fromtimestamp, но я новичок в python (и pandas), поэтому я изо всех сил стараюсь это сделать.

Любая помощь будет оценена по достоинству.

благодаря

2 Solutions collect form web for “Преобразование строки временной метки JSON в дату python в кадре данных pandas”

Очевидно, было бы лучше, если бы вы знали, откуда приходит JSON, и можете посмотреть в документах / спросить автора / и т. Д. чтобы узнать, каково фактическое намерение за этим форматом даты. (Он может даже быть сгенерирован кодом Python, используя библиотеку, которую вы можете просто использовать самостоятельно …)

Но, глядя на цифры, я могу довольно хорошо догадаться, что это означает: 1405961743000 – миллисекунды с эпохи Unix (что объясняет, почему вы можете использовать первые 10 цифр в виде секунд с момента Unix, по крайней мере, в пределах довольно широкий диапазон около 2014 года), а +0100 – смещение часового пояса от GMT, в формате +HHMM .

Таким образом, вместо того, чтобы извлекать первые 10 цифр, конвертируя в int и вызывая fromtimestamp , вы хотите извлечь все до + или - , преобразовать в int, делить на 1000 и вызвать fromtimestamp . Хотя тот факт, что единственный пример, который вы нам дали, имеет 0 миллисекунд, означает, что у них есть все шансы, и в этом случае это различие не имеет значения …

В любом случае, это зависит от вас, что делать с смещением часового пояса. Вы хотите хранить информацию о местных датах? GMT datetimes? наивные локальные даты? Им очень легко добраться из временной метки и смещения (хотя «осознанный» будет означать использование поддельного часового пояса, такого как GMT-05: 00, который, конечно же, не имеет никакой исторической или DST-информации), но вы должны решить, какой из них вы хотите.


Что бы вы ни делали, вы можете рассмотреть возможность расширения вашего JSON-декодера для его автоматизации, как показано в примерах в документах . (Любая строка, которая соответствует регулярному выражению r'/Date\((\d+)([+-]\d{4})\)/' , первая группа – это метка времени, а вторая – смещение.)

Но, возможно, нет. Тем более, что parse_string , похоже, не может быть переопределяемым, по крайней мере, с 3,4, поэтому похоже, что вам придется обезвредить его. См. Этот код, который я ударил вместе как доказательство концепции; вы, возможно, сможете сделать это немного лучше, но есть предел тому, насколько чистым вы можете это сделать, если они не предоставили ему крючок …


PS, если вы когда-либо распространяете JSON самостоятельно, вы можете рассмотреть более стандартизованный и самодокументирующий способ сделать это. Формат dict, показанный в документах json module, где вы фактически указываете конструктор для вызова и аргументы для его передачи, намного проще для людей разобраться (и добавить крючок для). Или, альтернативно, существует квазистандартный способ кодирования форматов YAML в форматах JSON, а YAML – расширяемый (и уже имеет стандартное временное расширение).

Строка времени – это формат OData версии 2 JSON для Datetime :

“/Date(<ticks>[“+” | “-” <offset>])/”
<ticks> = число миллисекунд с полуночи 1 января 1970 г.
<offset> = количество минут для добавления или вычитания

Как отмечает @Matt Johnson, формат можно увидеть в приложениях ASP.NET или WCF.

 #!/usr/bin/env python3 import re from datetime import datetime, timedelta, timezone time_string = "/Date(1405961743000+0100)/" epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) ticks, offset = re.match(r'/Date\((\d+)([+-]\d{4})?\)/$', time_string).groups() utc_dt = epoch + timedelta(milliseconds=int(ticks)) print(utc_dt, utc_dt.strftime('%Z')) if offset: offset = int(offset) # http://www.odata.org/documentation/odata-version-2-0/json-format # says offset is minutes (an error?) dt = utc_dt.astimezone(timezone(timedelta(minutes=offset))) print(dt, dt.strftime('%Z')) # but it looks like it could be HHMM hours, minutes = divmod(abs(offset), 100) if offset < 0: hours, minutes = -hours, -minutes dt = utc_dt.astimezone(timezone(timedelta(hours=hours, minutes=minutes))) print(dt, dt.strftime('%Z')) 

Вывод

 2014-07-21 16:55:43+00:00 UTC+00:00 2014-07-21 18:35:43+01:40 UTC+01:40 2014-07-21 17:55:43+01:00 UTC+01:00 

Похоже, что документы odata.org следует игнорировать, а смещение следует рассматривать как формат HHMM.

  • несколько объектов Json в одном файле извлечения python
  • Почему я получаю «python int too large to convert to C long», когда я использую DateFormatter от matplotlib для форматирования дат на оси x?
  • Т-тест в Pandas (Python)
  • Reindexing pandas timeseries от объекта dtype до datetime dtype
  • Самый быстрый способ создания строго растущих списков в Python
  • Преобразование списка dicts в кадр данных Pandas
  • SQL-инъекция в пандах; список привязки к параметрам в SQLAlchemy
  • Сортированные кумулятивные участки
  • Python - лучший язык программирования в мире.