У меня есть набор данных, в котором столбец 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»
Вы обрабатываете эти данные в фрейме данных pandas?
@ relent95 на самом деле ни одна библиотека не должна анализировать сокращенные имена tz, такие как «BST», не из-за летнего времени, а из-за неоднозначности. Существует как минимум 3 часовых пояса по летнему поясному времени. OP должен будет определить, на какой tz сопоставляются аббревиатуры; например «Европа/Лондон».
@FObersteiner - да, это обрабатывается в фрейме данных pandas. Как бы вы определили tz каждой строки в столбце, чтобы все они были стандартизированы?
Вот вариант, как вы можете справиться с этим. Как отмечалось, сокращенные имена 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, попробуйте использовать «неоднозначный» аргумент.
Метод 2, снова я получаю сообщение об ошибке TypeError: Parser должен быть строковым или символьным потоком, а не плавающим
@ U108456 хорошо, тогда обязательно используйте метод № 2. Я забыл упомянуть о проблеме DST. Что касается ошибки, вы скопировали и вставили мой синтетический пример и убедились, что он работает? Убедились ли вы, что все элементы столбца, которые вы хотите преобразовать, имеют строковый тип?
Я попробовал способ 2, как вы написали, и он работает. Однако, когда я помещаю столбец (столбец pandas, dtype: object), он дает мне то же сообщение об ошибке, но в моих данных нет поплавка, когда я проверял
data = pd.read_csv("XXX.csv")
data["input"] = data["Date and time"]
tzmapping = {"GMT": tz.gettz("Europe/London"), "BST": tz.gettz("Europe/London")}
data["datetime"] = data["input"].apply(parser.parse, tzinfos=tzmapping).dt.tz_convert("UTC")
@ U108456 U108456 хм, это странно, можете ли вы добавить примерное содержание data["Date and time"] к вопросу + трассировку ошибок?
Я думаю, что мне удалось добавить некоторое содержимое столбца, я добавил еще один столбец, чтобы привести пример моих данных, но это имеет отношение к этой задаче. Также прилагается изображение ошибки.
@ U108456 Я обновил ответ, включив в него данные вашего примера. Однако я боюсь, что не смогу воспроизвести проблему, не увидев вашего фактического ввода...
Ваше решение действительно сработало. Ошибка школьника из-за того, что он не удалил 'NaN's первым! Спасибо
Формат '%Z' работает для системного часового пояса и UTC/GMT. Таким образом, вы должны разобрать часовой пояс самостоятельно. И я не знаю библиотеки, которая анализирует зону DST, например BST.