Использование:
y = df.date.dt.year
mask = df.date.dt.month.between(1, 3)
df['year'] = y.where(mask).bfill().fillna(y.max() + 1).sub(1).astype(int)
print (df)
date year
0 1995-03-15 1994
1 1995-07-06 1995
2 1995-09-13 1995
3 1995-12-12 1995
4 1996-03-14 1995
5 1996-07-01 1996
6 1996-09-17 1996
7 1996-12-12 1996
8 1997-03-13 1996
9 1997-06-25 1997
10 1997-09-10 1997
11 1997-12-12 1997
Объяснение
Используйте Series.between
по месяцам с Series.where
для замены NaN
s на несоответствующие значения:
print (y.where(df.date.dt.month.between(1, 3)))
0 1995.0
1 NaN
2 NaN
3 NaN
4 1996.0
5 NaN
6 NaN
7 NaN
8 1997.0
9 NaN
10 NaN
11 NaN
Name: date, dtype: float64
Затем воспользуйтесь обратным заполнением пропущенных значений:
print (y.where(df.date.dt.month.between(1, 3)).bfill())
0 1995.0
1 1996.0
2 1996.0
3 1996.0
4 1996.0
5 1997.0
6 1997.0
7 1997.0
8 1997.0
9 NaN
10 NaN
11 NaN
Name: date, dtype: float64
Пропущенные значения (последние строки) заменяются на год максимума с добавлением 1
:
print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1))
0 1995.0
1 1996.0
2 1996.0
3 1996.0
4 1996.0
5 1997.0
6 1997.0
7 1997.0
8 1997.0
9 1998.0
10 1998.0
11 1998.0
Name: date, dtype: float64
Последнее вычитание одного года:
print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1).sub(1))
0 1994.0
1 1995.0
2 1995.0
3 1995.0
4 1995.0
5 1996.0
6 1996.0
7 1996.0
8 1996.0
9 1997.0
10 1997.0
11 1997.0
Name: date, dtype: float6