Обработка дат разных локализаций в 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 шт):

Автор решения: Vasyl Kolomiets

Решился-таки в отдельном окружении установить подходящий мне 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'.
Работает. Будут проблемы - подправлю ответ. )

→ Ссылка