Использование DateOffset
является очевидным выбором здесь:
df['date'] - pd.offsets.DateOffset(years=100)
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05
Name: date, dtype: datetime64[ns]
Назначить его обратно:
df['date'] -= pd.offsets.DateOffset(years=100)
df
date
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05
У нас есть модуль offsets
, чтобы иметь делос нефиксированными частотами это пригодится в подобных ситуациях.
Чтобы исправить свой код, вы хотели бы применить datetime.replace
по строкам, используя apply
(не рекомендуется):
df['date'].apply(lambda x: x.replace(year=x.year-100))
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05
Name: date, dtype: datetime64[ns]
Или используя понимание списка,
df.assign(date=[x.replace(year=x.year-100) for x in df['date']])
date
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05
Ни одна из этих записей не очень хорошо справляется с NaT.