Функция 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=['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'])