Продолжаем писать робота, который собирает интересующие нас госконтракты и отправляет их на почту. Сегодня мы поговорим о важной библиотеке datetime. По ее названию понятно, что она предназначена для работы с временем и датами. 

Видео: Глеб Лиманский

Она пригодится нам, чтобы мы могли передавать в нашу функцию такой аргумент как daterange. С его помощью мы сможем выделять определенный промежуток времени, за который хотим получить контракты. Сегодня напишем функцию, которая будет возвращать нам промежуток в виде недели — либо автоматически от сегодняшнего числа, либо от того, которое вам необходимо.

Для начала импортируем библиотеку datetime, введя from datetime import timedelta, date и на время закомментируем нашу функцию с помощью """.

Назовем новую функцию get_week. Это будет функция с необязательным аргументом: если мы хотим выбрать конкретную дату и отсчитать от нее неделю назад, мы можем вписать дату; если же просто хотим получить отсчет на неделю назад от сегодняшнего числа, дату писать не нужно. Для этого укажем необязательный аргумент day, который по умолчанию будет None.

Дальше пропишем условие, чтобы разобраться с датой отсчета — мы хотим получить сегодняшнее число автоматически, если day будет равен None. Поэтому start_date зададим как раз с помощью библиотеки datetime.

Чтобы мы могли указать какую-то дату на входе нашей функции, нам нужно перевести ее в формат библиотеки datetime, то есть, сделать дату объектом библиотеки. Для этого используем функцию strptime, которая на вход получает число, распознает его формат и делает его понятным для библиотеки. В нашем случае формат будет ДД.ММ.ГГ.

Теперь, когда у нас есть точка отсчета, нам нужно отсчитать от нее ровно неделю. Для этого применим функцию timedelta. Создаем переменную end_date и вычитаем из start_date неделю, указывая промежуток weeks=1 в функции timedelta. Могут быть указаны и минуты, и годы, если это необходимо для какой-то задачи.

Мы получили конечную дату и можем посмотреть в документации к API «ГосЗатрат», как должна выглядеть строчка с датами, которую мы должны передать нашей главной функции (той, что мы закомментировали в начале урока). 

Сделаем по образцу. Назовем переменную date_range и воспользуемся методом f-строк, чтобы поместить внутрь фигурных скобок любые параметры, которые нам нужны. Сегодня это будут start_date и end_date, разделенные дефисом. 

Запустим get_week и посмотрим, что она вернет нам. В примере не будем указывать число — то есть, отсчет будет от дня записи этого урока.

Как видите, даты нам вернулись, но не в том формате, который просит API «ГосЗатрат» — нужно поменять местами дни, месяцы и годы. Для этого воспользуемся еще одной функцией библиотеки datetime — strftime — и добавим нужный формат в f-строку. Попробуем запустить функцию еще раз.

Получилось, наша функция вернула даты в нужном формате. Теперь можем раскомментировать нашу основную функцию get_contracts_by_region. Пора бы ее переименовать в просто get_contracts, ведь мы уже знаем, что можем получать контракты по любым поисковым параметрам. Перенесем сегодняшнюю функцию get_week наверх и продолжим.

Вместо supplierinn в запросе get_contracts укажем date_range и добавим значение из функции get_week. И поменяем еще кое-что — поскольку мы отсчитываем неделю назад, в f-строке функции get_week нужно поменять местами start_date и end_date

Пора проверить, как отработает наша функция. Передадим в функцию get_contracts временной промежуток в виде недели от дня записи урока и увидим в терминале, что параметр signDate вписывается в указанный нами временной промежуток.

И напоследок узнаем, как отработает функция, если указать ей конкретную дату, от которой нужно отсчитать неделю — пусть это будет 1 мая 2021 года. Если вы все сделали по инструкции, то параметр signDate впишется в неделю до 1 мая.

Сегодня мы научились брать даты в виде строчки, делать их объектом библиотеки, отсчитывать временные шаги вперед или назад и использовать эти знания для нашего будущего робота (представляете, мы уже почти дописали его!). Как всегда, ждем ваши вопросы в нашем чате в Telegram.