Функция np.select перестала работать, как ранее. Подскажите правильный вариант получения названия месяца

Имеется таблица с данными, в одном из столбцов указана дата совершения операции. Из даты вытягивается месяц. Далее с помощью функции np.select номеру месяца присваивалось соответствующее название. Ранее функция работала адекватно, но недавно открыл код, и там выдается ошибка:

TypeError: Choicelist and default value do not have a common dtype: The DType <class 'numpy.dtypes._PyLongDType'> could not be promoted by <class 'numpy.dtypes.StrDType'>. This means that no common DType exists for the given inputs. For example they cannot be stored in a single array unless the dtype is object. The full list of DTypes is: (<class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes.StrDType'>, <class 'numpy.dtypes._PyLongDType'>)

Фрагмент исполняемого самодостаточного кода:

import numpy as np
import pandas as pd

data = {'Name':['x', 'y', 'z', 'v'], 'Date':['2024.07.18', '2024.04.10', '2024.02.12', '2024.10.11']} 

df = pd.DataFrame(data)


df['month'] = pd.DatetimeIndex(df['Date']).month
df['month'] = df['month'].astype (str)


conditions1 = [
    (df['month'] == '1'),
    (df['month'] == '2'),
    (df['month'] == '3'),
    (df['month'] == '4'),
    (df['month'] == '5'),
    (df['month'] == '6'),
    (df['month'] == '7'),
    (df['month'] == '8'),
    (df['month'] == '9'),
    (df['month'] == '10'),
    (df['month'] == '11'),
    (df['month'] == '12')
    ]

values1 = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']

df['NameMonth'] = np.select(conditions1, values1)

Реальная таблица, из которой берутся данные, выглядит следующим образом:

Во втором столбце та самая дата

Я так понял, в numpy вышло какое-то обновление, разобраться не могу. Подскажите, пожалуйста, правильный выход. Может следует применять вообще другие функции. Конечная цель: получить столбец с названием месяца (а не цифрой). Благодарю!


Ответы (1 шт):

Автор решения: Алексей Р

np здесь можно не использовать, примените метод dt.month_name() в нужной локали

df['month'] = df['Date'].astype('datetime64[ns]').dt.month_name(locale='ru_RU')
  Name        Date    month
0    x  2024.07.18     Июль
1    y  2024.04.10   Апрель
2    z  2024.02.12  Февраль
3    v  2024.10.11  Октябрь

Если же непременно хотите названия месяцев извлекать из своего списка, то можно так:

df['month'] = df['Date'].astype('datetime64[ns]').dt.month.replace({num + 1: mes for num, mes in enumerate(['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'])})

И еще вариант с pd.cut()

df['month'] = pd.cut(df['Date'].astype('datetime64[ns]').dt.month, range(13),labels=['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'])
→ Ссылка