Тут много путей уменьшить код.
Можно начать с того, что у вас многократно повторяется.
К примеру,
if message.text == '26.01':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
bt1 = types.KeyboardButton('8:00')
bt2 = types.KeyboardButton('9:00')
bt3 = types.KeyboardButton('10:00')
bt4 = types.KeyboardButton('11:00')
bt5 = types.KeyboardButton('12:00')
bt6 = types.KeyboardButton('13:00')
bt7 = types.KeyboardButton('14:00')
bt8 = types.KeyboardButton('15:00')
bt9 = types.KeyboardButton('16:00')
bt10 = types.KeyboardButton('17:00')
bt11 = types.KeyboardButton('18:00')
bt12 = types.KeyboardButton('19:00')
bt13 = types.KeyboardButton('20:00')
bt14 = types.KeyboardButton('21:00')
back11 = types.KeyboardButton('Назад')
markup.add(bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, bt10, bt11, bt12, bt13, bt14, back11)
bot.send_message(message.chat.id, text='Выберите удобную вам дату для записи', reply_markup = markup)
повторяется несколько раз. Значит, этот фрагмент можно записать один раз и затем многократно вызывать, подставляя только меняющиеся элементы.
Но и внутри видно многократное повторение нумерованной переменной, это явный признак плохого кода.
Эту проблему можно решить разными способами. В данном случае, когда значения идут равномерно (час за часом), можно их просто сгенерировать, рассчитать, и поместить в список.
Например:
first_hour = 8
last_hour = first_hour + 14
buttons = [f'{current}:00' for current in range(first_hour, last_hour)]
print(buttons)
print(buttons[0])
И этот список и передавать в нужное место вместо
bt1, bt2, bt3, bt4, bt5, …
И не надо его всякий раз генерировать, один раз достаточно, потом в нужных случаях вызывать.
Следует отметить, что вам пока рано заниматься ботами. Сделайте что-то попроще, калькулятор например, игру «быки-коровы»… я не шучу.