0. Ставишь aiogram и читаешь
Quick start, чтобы понять, как в целом будет устроен бот.
1. Создаёшь и ведёшь базу пользователей бота, например, в
sqlite3. Как её наполнять, это уже второй вопрос. Также может потребоваться отдельная таблица напомнинаний, но тебе виднее что за напоминания будут.
2. В боте создаёшь через
asyncio.create_task() бесконечную задачу, которая
- проверяет время
- если сейчас подходящее время (скажем, полдень, 1е число месяца, плюс-минус 30 секунд), вызывает корутину уведомления пользователей,
- засыпает на минуту с помощью
await asyncio.sleep() (ни в коем случае не time.sleep()).
3. Корутина уведомления пользователей должна извлекать из твоей базы уведомления, которые нужно отправить и id пользователей, которым эти уведомления нужно отправить (см. доки по sqlite3 как извлекать данные из БД запросом SELECT). Затем для каждого пользователя она должна отправить текст (см. доки по aiogram) и обработать возможное исключение (например, если пользователь заблокировал бота).
4. Может потребоваться пара обработчиков команд, чтобы добавлять/менять текст напоминаний.