Обработка дат разных локализаций в Pandas. PyICU или "ручками"?
При работе с интернет магазином приходится обрабатывать данные разных локализаций. В них присутствует дата, которая важна для обработки. Естественно, формат даты разный в смысле разных языков - испанский, французский, английский, немецкий т др.
Вот например для испанского:
"9 sept 2021 12:19:03 GMT-7"
"8 feb 2022 23:28:33 GMT-8"
"1 ago 2021 00:31:47 GMT-7"
Когда пытаешься использовать в Pfndas pd.to_datetime() то получаешь ошибки.
pd.to_datetime("1 ago 2021 00:31:47 GMT-7")
ParserError: Unknown string format: 1 ago 2021 00:31:47 GMT-7
По теме есть решения здесь и здесь - использовать модуль PyICU. Но для него нет "родной" инсталляции для Windows.
В то же время меня подмывает "ручками" заменить для каждого языка нужные сокращения для месяцев и использовать pd.to_datetime() после контекстной замены. А то для каждого языка может быть несколько локалей. Испанский - Мексика и Испания и т.д.
Вопрос 1: Какие выгоды от использования PyICU и какие "проблемы" возможны при "ручной" подмене сокращений месяцев. По названию файла я могу понять - какой там язык.
Вопрос 2: Может появился какой-то новый модуль, который парсит дату без необхожимости подсказывать ему язык?
Вопрос 3, короткий): Как парсить дату при чтении из csv если там разные языки в дате?
Добавлено. Думаю, меня устроит решение, приведенное здесь а таблицу всех зон с часами смещения можно взять здесь.
Ответы (1 шт):
Решился-таки в отдельном окружении установить подходящий мне PyICU-2.9-cp39-cp39-win_amd64.whl взятый отсюда. Позаимствов код из приведенных источников и плюнув на зональное время, получил универсальный парсер:
import icu # PyICU https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyicu
# import pytz # $ pip install pytz
def parse_date_tz(date_str: str, locale: str) -> datetime:
"""
Parse datetime string with locale shortcut specified to naive datetime.
Parameters
----------
date_str : str
datetime stamp to be parsed.
Example: "1 ago 2021 00:31:47 GMT-7"
locale : str
Standart locale shortcut.
Example: 'es_MX'
Returns
-------
datetime.datetime
parsed naive datetime.
>>> parse_date_tz("1 ago 2021 00:31:47 GMT-7", 'es_MX')
>>> datetime.datetime(2021, 8, 1, 0, 31, 47)
"""
tz = icu.ICUtzinfo.getDefault() # any ICU timezone will do here
df = icu.DateFormat.createDateTimeInstance(icu.DateFormat.MEDIUM,
icu.DateFormat.MEDIUM,
icu.Locale(locale))
df.setTimeZone(tz.timezone)
ts = df.parse(date_str) # u'3 févr. 2015 14:26:00 CET' NOTE: CET is ignored
naive_dt = datetime.fromtimestamp(ts, tz).replace(tzinfo=None)
return naive_dt
Ну и применяется он прекрасно к нужному столбцу строк примерно так:
df_df.loc[:, "fecha/hora"] = df_df["fecha/hora"].apply(parse_date_tz, locale='es_MX')
Поскольку имя файла содержит аббревиатуру страны, локаль найти не сложно. Скажем 'es_MX' или 'es_ES'.
Работает. Будут проблемы - подправлю ответ. )