Если дата разного формата, как извлечь год?

Есть фрейм со столбцом bdate. Строки могут принимать значения:

  1. Unfiled_bdate
  2. dd.mm
  3. dd.mm.yyyy
  4. yyyy

Задача, в столбце получить год (если он указан), а в ином случая - значение 'Unfiled_bdate'.

Пробовал убирать точки, чтобы потом int значения по условию заменить на нужные, но не вышло.

Подскажите, как это эффективно реализовать (будет более 10КК строк)?

Текущие данные:

import pandas as pd
    
bdate = ['7.10', 'Unfiled_bdate', '23.3', '22.7.1985', '10.5.1994', '10.9.1959', '14.04.2021', '1.1.1987',
         '5.1.2005', '19.06.2021', '17.5.1997', '4.7.2000', '31.12.2006', '28.12.2006', '25.2.1998, 2.6',
         '10.8.1994', 'Unfiled_bdate', '1954', '1999'] #несколько текщих строк данных
    
df = pd.DataFrame()
df['bdate'] = bdate # текущий датафрейм

То, что хочу получить:

bdate_clear = ['Unfiled_bdate', 'Unfiled_bdate', 'Unfiled_bdate', '1985', '1994', '1959', '2021', '1987',
         '2005', '2021', '1997', '2000', '2006', '2006', '1998', 'Unfiled_bdate',
         '1994', 'Unfiled_bdate', '1954', '1999']
    
    df_clear = pd.DataFrame()
    df_clear['bdate'] = bdate_clear # желаемый результат

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

Автор решения: Jack_oS

Без pandas и не в одну строку, но рабочее решение для ваших входных данных:

bdate = ['7.10', 'Unfiled_bdate', '23.3', '22.7.1985', '10.5.1994', '10.9.1959', '14.04.2021', '1.1.1987', '5.1.2005', '19.06.2021', '17.5.1997', '4.7.2000', '31.12.2006', '28.12.2006', '25.2.1998', '2.6', '10.8.1994', 'Unfiled_bdate', '1954', '1999']


def year_search(el):
    for e in el.split('.'):
        if len(e) == 4:
            return e
    return 'Unfiled_bdate'

bdate_clear = [year_search(b) for b in bdate]

в bdate_clear будет:

>>> bdate_clear
['Unfiled_bdate', 'Unfiled_bdate', 'Unfiled_bdate', '1985', '1994', '1959', '2021', '1987', '2005', '2021', '1997', '2000', '2006', '2006', '1998', 'Unfiled_bdate', '1994', 'Unfiled_bdate', '1954', '1999']

→ Ссылка
Автор решения: MaxU

Воспользуйтесь Series.str.extract():

df["year"] = df["bdate"].str.extract(r"\b(\d{4})\b").fillna("Unfiled_bdate")

результат:

In [20]: df
Out[20]:
             bdate           year
0             7.10  Unfiled_bdate
1    Unfiled_bdate  Unfiled_bdate
2             23.3  Unfiled_bdate
3        22.7.1985           1985
4        10.5.1994           1994
5        10.9.1959           1959
6       14.04.2021           2021
7         1.1.1987           1987
8         5.1.2005           2005
9       19.06.2021           2021
10       17.5.1997           1997
11        4.7.2000           2000
12      31.12.2006           2006
13      28.12.2006           2006
14  25.2.1998, 2.6           1998
15       10.8.1994           1994
16   Unfiled_bdate  Unfiled_bdate
17            1954           1954
18            1999           1999
→ Ссылка