Как преобразовать столбец с несколькими часовыми поясами в UTC в Python

У меня есть набор данных, в котором столбец date_time содержит смесь даты и времени BST и GMT в следующем формате «Вс, 27 марта 2022 г., 00:59:03 по Гринвичу». Я хотел бы преобразовать весь этот столбец в следующий формат «2022-03-27 00:59:03» и в один стандартный часовой пояс, например UTC. Где я ошибаюсь??

Я попытался использовать strptime() для преобразования даты тестера, но это работает только со временем по Гринвичу.

date_time_str = 'Sun 27 Mar 2022 12:59:03 AM GMT'
date_time_obj = datetime.datetime.strptime(date_time_str, '%a %d %b %Y %I:%M:%S %p %Z')
print('Date-time:', date_time_obj)
Дата и время: 2022-03-27 00:59:03

Затем попробовал с BST

date_time_str_bst = 'Sun 27 Mar 2022 02:00:02 AM BST'
date_time_obj_bst = datetime.datetime.strptime(date_time_str_bst, '%a %d %b %Y %I:%M:%S %p %Z')
ValueError: данные времени «Вс, 27 марта 2022 г., 02:00:02 BST» не соответствуют формату «%a %d %b %Y %I:%M:%S %p %Z»

Формат '%Z' работает для системного часового пояса и UTC/GMT. Таким образом, вы должны разобрать часовой пояс самостоятельно. И я не знаю библиотеки, которая анализирует зону DST, например BST.

relent95 11.01.2023 06:29

Вы обрабатываете эти данные в фрейме данных pandas?

FObersteiner 11.01.2023 08:47

@ relent95 на самом деле ни одна библиотека не должна анализировать сокращенные имена tz, такие как «BST», не из-за летнего времени, а из-за неоднозначности. Существует как минимум 3 часовых пояса по летнему поясному времени. OP должен будет определить, на какой tz сопоставляются аббревиатуры; например «Европа/Лондон».

FObersteiner 11.01.2023 11:04

@FObersteiner - да, это обрабатывается в фрейме данных pandas. Как бы вы определили tz каждой строки в столбце, чтобы все они были стандартизированы?

U108456 11.01.2023 18:15
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот вариант, как вы можете справиться с этим. Как отмечалось, сокращенные имена tz, такие как «BST», неоднозначны. Вам нужно будет определить, какой tz соответствует аббревиатурам; например «Европа/Лондон» для BST/GMT.

Определить отображение часового пояса {аббревиатура --> название IANA tz}, применить синтаксический анализатор, а затем преобразовать в UTC

Данный

df
                     Date and time  temp
0  Sun 27 Mar 2022 12:57:03 AM GMT  33.9
1  Sun 27 Mar 2022 12:58:02 AM GMT  33.6
2  Sun 27 Mar 2022 12:59:03 AM GMT  33.6
3  Sun 27 Mar 2022 02:00:02 AM BST  33.9
4  Sun 27 Mar 2022 02:01:03 AM BST  33.6
5  Sun 27 Mar 2022 02:02:02 AM BST  33.6

Бег

import pandas as pd
import dateutil

tzmapping = {"GMT": dateutil.tz.gettz("Europe/London"),
             "BST": dateutil.tz.gettz("Europe/London")}

df["dt_UTC"] = df["Date and time"].apply(dateutil.parser.parse, tzinfos=tzmapping).dt.tz_convert("UTC")

Дает

df
                     Date and time  temp                    dt_UTC
0  Sun 27 Mar 2022 12:57:03 AM GMT  33.9 2022-03-27 00:57:03+00:00
1  Sun 27 Mar 2022 12:58:02 AM GMT  33.6 2022-03-27 00:58:02+00:00
2  Sun 27 Mar 2022 12:59:03 AM GMT  33.6 2022-03-27 00:59:03+00:00
3  Sun 27 Mar 2022 02:00:02 AM BST  33.9 2022-03-27 01:00:02+00:00
4  Sun 27 Mar 2022 02:01:03 AM BST  33.6 2022-03-27 01:01:03+00:00
5  Sun 27 Mar 2022 02:02:02 AM BST  33.6 2022-03-27 01:02:02+00:00

Спасибо @FObersteiner за помощь. Я попробовал метод 1 и прогнал его через свой столбец дат, но получил сообщение об ошибке, когда время меняется позже в этом году (вс, 30 октября 2022 г., 01:59:02 по московскому времени, вс, 30 октября 2022 г., 01:00: 03 мск). Сообщение об ошибке: AmbiguousTimeError: невозможно определить время летнего времени с 2022-10-30 01:00:02, попробуйте использовать «неоднозначный» аргумент.

U108456 11.01.2023 23:11

Метод 2, снова я получаю сообщение об ошибке TypeError: Parser должен быть строковым или символьным потоком, а не плавающим

U108456 11.01.2023 23:12

@ U108456 хорошо, тогда обязательно используйте метод № 2. Я забыл упомянуть о проблеме DST. Что касается ошибки, вы скопировали и вставили мой синтетический пример и убедились, что он работает? Убедились ли вы, что все элементы столбца, которые вы хотите преобразовать, имеют строковый тип?

FObersteiner 12.01.2023 07:42

Я попробовал способ 2, как вы написали, и он работает. Однако, когда я помещаю столбец (столбец pandas, dtype: object), он дает мне то же сообщение об ошибке, но в моих данных нет поплавка, когда я проверял

U108456 12.01.2023 16:11
data = pd.read_csv("XXX.csv")
U108456 12.01.2023 16:15
data["input"] = data["Date and time"]
U108456 12.01.2023 16:17
tzmapping = {"GMT": tz.gettz("Europe/London"), "BST": tz.gettz("Europe/London")}
U108456 12.01.2023 16:17
data["datetime"] = data["input"].apply(parser.parse, tzinfos=tzmapping).dt.tz_convert("UTC")
U108456 12.01.2023 16:17

@ U108456 U108456 хм, это странно, можете ли вы добавить примерное содержание data["Date and time"] к вопросу + трассировку ошибок?

FObersteiner 12.01.2023 16:42

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

U108456 12.01.2023 17:36

@ U108456 Я обновил ответ, включив в него данные вашего примера. Однако я боюсь, что не смогу воспроизвести проблему, не увидев вашего фактического ввода...

FObersteiner 12.01.2023 17:53

Ваше решение действительно сработало. Ошибка школьника из-за того, что он не удалил 'NaN's первым! Спасибо

U108456 12.01.2023 22:43

Другие вопросы по теме