Как преобразовать незнакомые строки datetime в осведомленные объекты datetime с часовым поясом? - PullRequest
0 голосов
/ 01 мая 2019

Я выполняю запросы к базам данных Big Query и Postgres и возвращаю результаты в виде списков, которые я позже преобразовываю в кадры данных pandas.Результаты выглядят примерно так:

| date                | column2 | column3 |
|---------------------|---------|---------|
| 2019-05-01 17:05:00 | ....... | ....... |
| 2019-05-01 17:10:00 | ....... | ....... |
| 2019-05-01 17:10:00 | ....... | ....... |
| 2019-05-01 17:15:00 | ....... | ....... |
| ................... | ....... | ....... |

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

Другая проблема заключается в том, что, поскольку выполняемые мною запросы SQL учитывают часовые пояса, строки даты и времени, сохраненные в кадре данных, знают, хотя отображать нечего (например, смещение utc).

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

Но я столкнулся с несколькими проблемами, такими как:

  • не может преобразовать объект метки времени pandas в объект даты и времени python для всего столбца «date»,
  • при принудительном использовании часового пояса BST "2019-05-01 17:00:00"и использую to_pydatetime() я получаю что-то вроде" 2019-05-01 17:00:00 +01: 00 ", и я не знаю, что это значит, и
  • Я хочу получить строку или дату и времяот "2019-05-01 17:00:00 +01: 00" со смещением, включенным во время.

Подводя итог , скажем, я загружаю результатыгде каждая строка с указанием даты и времени должна иметь часовой пояс BST, а первая дата - 2019-05-01 17:05:00.

Как я могу сообщить python, что указанное выше время указано в BST, что означает:

  • , когда я сравниваю его с 2019-05-01 17:05:00 UTC, оно должно быть ниже, чем с 2019-05-01 17:05:00 BST на самом деле 2019-05-01 16:05:00 UTC

Как я могу преобразовать его из строкового типа в объект даты и времени python в формате "% Y-% m-% d% H:% M:% S ", где смещение включено, что означает:

  • , когда я печатаю часть"% H ", это должно быть 17. В то же время, если я печатаю смещение, оно должно быть +00: 00потому что оно уже «применено».

Пожалуйста, дайте мне знать, если что-то не имеет смысла или я неправильно понял что-то важное о часовых поясах в python и общем в машинах.

Любой ответ, который помогает мне понять больше, приветствуется.

1 Ответ

1 голос
/ 01 мая 2019

Чтобы добавить осознанность, я думаю, dt.localize - это то, что вы ищете:

import pandas as pd

aware = pd.to_datetime(df['date']).dt.tz_localize('Europe/London')
>>> aware
0   2019-05-01 17:05:00+01:00
1   2019-05-01 17:10:00+01:00
2   2019-05-01 17:10:00+01:00
3   2019-05-01 17:15:00+01:00
Name: date, dtype: datetime64[ns, Europe/London]

Обратите внимание, что +01:00 здесь это обозначение для информации о часовом поясе, указывающее, что один часбыло добавлено к времени UTC / GMT для получения этой отметки времени (по крайней мере, я так понимаю).
Теперь, если вы хотите преобразовать в utc, используйте dt.tz_convert:

utc = aware.dt.tz_convert('utc')
>>> utc
0   2019-05-01 16:05:00+00:00
1   2019-05-01 16:10:00+00:00
2   2019-05-01 16:10:00+00:00
3   2019-05-01 16:15:00+00:00
Name: date, dtype: datetime64[ns, UTC]

Обновление: сделка с NonExistentTimeError

Из документов, которые я связал выше, dt.tz_localize:
, если у вас естьвремя, когда не существует в конкретном часовом поясе, где часы переместились вперед из-за перехода на летнее время , рассмотрите параметры nonexistent или errors (лучше nonexistent).

nonexistent позволяет вам выбирать из:

  • сдвиг вперед
  • сдвиг назад
  • установка пользовательского сдвига
  • NaT
  • повышение NonExistentTimeError (по умолчанию)

Пример: (добавлено 2019-03-31 01:00:00 согласно вашему комментарию)

aware = pd.to_datetime(df['date']).dt.tz_localize('Europe/London', nonexistent="shift_forward")
>>> print(aware)
0   2019-05-01 17:05:00+01:00
1   2019-05-01 17:10:00+01:00
2   2019-05-01 17:10:00+01:00
3   2019-05-01 17:15:00+01:00
4   2019-03-31 03:00:00+01:00
Name: date, dtype: datetime64[ns, Europe/London]


aware = pd.to_datetime(df['date']).dt.tz_localize('Europe/London', nonexistent="NaT")
>>> print(aware)
0   2019-05-01 17:05:00+01:00
1   2019-05-01 17:10:00+01:00
2   2019-05-01 17:10:00+01:00
3   2019-05-01 17:15:00+01:00
4                         NaT
Name: date, dtype: datetime64[ns, Europe/London]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...