Сначала возможен тест на правильность очистки, проверьте, есть ли некоторые даты, которые не могут быть проанализированы с to_datetime
и параметром errors='coerce'
, поэтому не проанализированные даты и времена NaT
, отфильтрованные с помощью Series.isna
и boolean indexing
:
print (astrology[pd.to_datetime(astrology['birthdate'], errors='coerce').isna()])
Затем используется преобразование в datetime для формата месяца и дней Series.dt.strftime
и для годы Series.dt.year
, но необходимо вычесть 100
, чтобы избежать анализа лет выше текущего года:
dates = pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(monthday = dates.dt.strftime('%m/%d'),
year = y.mask(y > now, y - 100))
print (astrology)
birthdate howMuch monthday year
0 1/1/95 8 01/01 1995
1 3/15/80 7 03/15 1980
2 5/28/86 1 05/28 1986
3 11/16/61 5 11/16 1961
4 12/15/88 2 12/15 1988
Если здесь используется столбец месяца месяца без дополняющих нулей Series.str.rsplit
с выбором первых списков путем индексации str[0]
:
md = astrology['birthdate'].str.rsplit('/', n=1).str[0]
dates = pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(monthday = md,
year = y.mask(y > now, y - 100))
print (astrology)
birthdate howMuch monthday year
0 1/1/95 8 1/1 1995
1 3/15/80 7 3/15 1980
2 5/28/86 1 5/28 1986
3 11/16/61 5 11/16 1961
4 12/15/88 2 12/15 1988