Как извлечь год из столбца со смешанными форматами

У меня есть столбец в моем наборе данных, который выглядит как дата в разных форматах. Иногда это только год и месяц, а иногда только год:

Дата
1 января 1980 г.
Октябрь-74
17 октября
1980,0
-200
-50
8

Я хочу извлечь только год из этого столбца. Для дат в формате «ммм-гг» я хочу предположить, что они находятся между 1921 и 2020 годами. Таким образом, мой столбец выше должен выглядеть так:

Год
1980 г.
1974 г.
2017
1980 г.
-200
-50
8

Как я могу сделать это в Python? Любая помощь будет оценена по достоинству.

#here is the code for the first dataframe
data = {'date': ['1 January 1980','Oct-74', 'Oct-17', '1980.0', '-200.0', '-50']}  
df= pd.DataFrame(data)
df
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

data = {'date': ['1 January 1980','Oct-74', 'Oct-17', '1980.0', '-200.0', '-50', '8']}  
df= pd.DataFrame(data)
temp = df['date'].str.replace('[a-zA-Z]{3}-', '+').str.extract('([-+\.\d]{1,}$)')
m1 = temp[0].str.contains('\+')
temp[0] = temp[0].astype(float)
temp[0] = temp[0].where(~((m1)&(temp[0]>=21)), 1900+temp[0])
temp[0] = temp[0].where(~((m1)&(temp[0]<21)), 2000+temp[0])

Выход:

Спасибо! Единственная проблема, которую я обнаружил, заключается в том, что она не работает для случаев, например, если дата равна «8» (в этом случае я хочу, чтобы год был 8, тогда как это возвращает NaN). Насколько я понимаю, регулярное выражение в команде замены фильтрует типы дат «OCT-74». Означает ли это, что нужно изменить регулярное выражение в команде извлечения? А последующие строки, чтобы мы не добавляли 2000 или 1900 для таких строк?

MB1001 10.04.2022 06:06

Я также отредактировал свой исходный вопрос, добавив пример, в котором дата и год могут быть равны 8, поскольку я понял, что это усложняет решение.

MB1001 10.04.2022 06:11

Проверьте ответ сейчас.

keramat 10.04.2022 06:22

Другие вопросы по теме