Фрейм данных Pandas - to_json () to_csv () не действуют одинаково для дат в формате iso - PullRequest
0 голосов
/ 27 ноября 2018

Я получаю даты из моего API в формате iso.

Когда я делаю:

df = DataFrame(results)
df.to_csv(path_or_buf=file_name, index=False, encoding='utf-8',
          compression='gzip',
          quoting=QUOTE_NONNUMERIC)

И я смотрю на CSV, который я вижу, например:

lastDeliveryDate
2018-11-21 16:25:53.990000-05:00

Однако

Когда я делаю:

df = DataFrame(results)
df.to_json(path_or_buf=file_name, orient="records",compression='gzip', lines=True)

Вижу (другая запись):

"lastDeliveryDate":1543258826689

Это проблема.

Когда я загружаю данные из CSV в Google BigQuery, все в порядке.Дата анализируется правильно.

Но когда я изменил загрузку на Json.Не правильно разбирает дату.

Я вижу даты в этом формате:

50866-01-09 23:46:40 UTC

Это происходит потому, что to_json() и to_csv() дают разные результаты для дат в iso_format

Какя могу это исправить?Должен ли я редактировать фрейм данных и преобразовать все мои столбцы дат в обычный UTC?Как мне это сделать?а зачем это нужно для to_json() а не for to_csv()?

как объяснено на Как преобразовать строку даты-времени ISO 8601 в объект даты-времени Python? Попытался сделать:

df["lastDeliveryDate"] = dateutil.parser.parse(df["lastDeliveryDate"])  

Но это дает:

TypeError: Parser должен быть строкой или символьным потоком, а не Series

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Из документации Pandas по to_json():

date_format : {Нет, 'эпоха', 'iso'}
Тип конверсии даты.'epoch' = эпоха миллисекунд, 'iso' = ISO8601.По умолчанию зависит от ориентации.Для orient='table' по умолчанию используется iso.Для всех остальных ориентиров по умолчанию используется значение 'epoch'.

Итак, с orient="records" вам придется установить date_format="iso", чтобы получить формат даты и времени, который будет понят позже.:

df.to_json(path_or_buf=file_name, orient="records", date_format="iso", 
           compression='gzip', lines=True)
0 голосов
/ 27 ноября 2018

В основном dateutil.parser.parse() ожидает строку в качестве параметра, но вы передали весь столбец.Попробуйте с помощью лямбда-функции:

df["lastDeliveryDate"] = df["lastDeliveryDate"].apply( lambda row: dateutil.parser.parse(row))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...