Попробуйте:
old_date = '01-01-1970'
future_date = '01-01-2050'
cuts = pd.to_datetime([old_date, '01-04-2018', '04-05-2018', '05-31-2018',
'08-02-2018', '09-27-2018', '01-03-2019',
'02-14-2019', '03-28-2019', future_date])
df = pd.DataFrame({'date': pd.date_range('01-01-2018', '04-05-2019', freq='MS')})
df['ped'] = pd.cut(df['date'], bins=cuts).cat.codes
Вывод:
+----+---------------------+-------+
| | date | ped |
|----+---------------------+-------|
| 0 | 2018-01-01 00:00:00 | 0 |
| 1 | 2018-02-01 00:00:00 | 1 |
| 2 | 2018-03-01 00:00:00 | 1 |
| 3 | 2018-04-01 00:00:00 | 1 |
| 4 | 2018-05-01 00:00:00 | 2 |
| 5 | 2018-06-01 00:00:00 | 3 |
| 6 | 2018-07-01 00:00:00 | 3 |
| 7 | 2018-08-01 00:00:00 | 3 |
| 8 | 2018-09-01 00:00:00 | 4 |
| 9 | 2018-10-01 00:00:00 | 5 |
| 10 | 2018-11-01 00:00:00 | 5 |
| 11 | 2018-12-01 00:00:00 | 5 |
| 12 | 2019-01-01 00:00:00 | 5 |
| 13 | 2019-02-01 00:00:00 | 6 |
| 14 | 2019-03-01 00:00:00 | 7 |
| 15 | 2019-04-01 00:00:00 | 8 |
+----+---------------------+-------+
Редактировать: существует проблема с датой окончания, т.е. 2019-03-28
дает 7 в этом коде вместо 8
вваш код.Это можно решить, уменьшив пороги на 1 день.