Вы не предоставляете достаточно корзин.Хотя ваш максимальный год составляет 2018
, поскольку у вас есть даты, которые должны быть сгруппированы с 2019, вам необходимо увеличить максимальный год на 1. Аналогично, вы должны вычесть 1 из минимального года.
y_max = data.year.max() + 1
y_min = data.year.min() - 1
Теперьу вас будут правильные корзины и метки, охватывающие весь набор данных:
pd.date_range(str(y_min), str(y_max+1), freq='BAS-JUL')
#DatetimeIndex(['2007-07-02', '2008-07-01', '2009-07-01', '2010-07-01', '2011-07-01',
# '2012-07-02', '2013-07-01', '2014-07-01', '2015-07-01',
# '2016-07-01', '2017-07-03', '2018-07-02', '2019-07-01'],
# dtype='datetime64[ns]', freq='BAS-JUL')
labels = [str(x) + ' - ' + str(x+1) for x in np.arange(y_min, y_max, 1)]
#['2007 - 2008',
# '2008 - 2009',
# '2009 - 2010',
#...
# '2017 - 2018',
# '2018 - 2019']