Пишем своего робота на Python. Урок 6
Получаем контракты за конкретный промежуток времени с помощью библиотеки datetime
![Пишем своего робота на Python. Урок 6](https://storage.googleapis.com/static.istories.media/uploaded/images/9d8f05816dd94912b4880523c8610f83-1920x960px_1x.png)
Продолжаем писать робота, который собирает интересующие нас госконтракты и отправляет их на почту. Сегодня мы поговорим о важной библиотеке datetime. По ее названию понятно, что она предназначена для работы с временем и датами.
Она пригодится нам, чтобы мы могли передавать в нашу функцию такой аргумент как daterange. С его помощью мы сможем выделять определенный промежуток времени, за который хотим получить контракты. Сегодня напишем функцию, которая будет возвращать нам промежуток в виде недели — либо автоматически от сегодняшнего числа, либо от того, которое вам необходимо.
Для начала импортируем библиотеку datetime, введя from datetime import timedelta, date и на время закомментируем нашу функцию с помощью """.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/64da19e4dcd74496b389a05e9357c6a5-1200xautopx_1x.png)
Назовем новую функцию get_week. Это будет функция с необязательным аргументом: если мы хотим выбрать конкретную дату и отсчитать от нее неделю назад, мы можем вписать дату; если же просто хотим получить отсчет на неделю назад от сегодняшнего числа, дату писать не нужно. Для этого укажем необязательный аргумент day, который по умолчанию будет None.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/4a18598b09e646aba5a44813c8ef9c55-1200xautopx_1x.png)
Дальше пропишем условие, чтобы разобраться с датой отсчета — мы хотим получить сегодняшнее число автоматически, если day будет равен None. Поэтому start_date зададим как раз с помощью библиотеки datetime.
Чтобы мы могли указать какую-то дату на входе нашей функции, нам нужно перевести ее в формат библиотеки datetime, то есть, сделать дату объектом библиотеки. Для этого используем функцию strptime, которая на вход получает число, распознает его формат и делает его понятным для библиотеки. В нашем случае формат будет ДД.ММ.ГГ.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/89c36ae246c843d29f0a95f7fd12eaec-1200xautopx_1x.png)
Теперь, когда у нас есть точка отсчета, нам нужно отсчитать от нее ровно неделю. Для этого применим функцию timedelta. Создаем переменную end_date и вычитаем из start_date неделю, указывая промежуток weeks=1 в функции timedelta. Могут быть указаны и минуты, и годы, если это необходимо для какой-то задачи.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/a55246472ab842738b32b16a00d7dab8-1200xautopx_1x.png)
Мы получили конечную дату и можем посмотреть в документации к API «ГосЗатрат», как должна выглядеть строчка с датами, которую мы должны передать нашей главной функции (той, что мы закомментировали в начале урока).
![](https://storage.googleapis.com/static.istories.media/uploaded/images/c7e8ea39d66446d383dcad807eb573d6-1200xautopx_1x.png)
Сделаем по образцу. Назовем переменную date_range и воспользуемся методом f-строк, чтобы поместить внутрь фигурных скобок любые параметры, которые нам нужны. Сегодня это будут start_date и end_date, разделенные дефисом.
Запустим get_week и посмотрим, что она вернет нам. В примере не будем указывать число — то есть, отсчет будет от дня записи этого урока.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/ac35735971324dc5939959ca7e448551-1200xautopx_1x.png)
Как видите, даты нам вернулись, но не в том формате, который просит API «ГосЗатрат» — нужно поменять местами дни, месяцы и годы. Для этого воспользуемся еще одной функцией библиотеки datetime — strftime — и добавим нужный формат в f-строку. Попробуем запустить функцию еще раз.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/f61474cb5b7a4008893ff7312b67df4c-1200xautopx_1x.png)
Получилось, наша функция вернула даты в нужном формате. Теперь можем раскомментировать нашу основную функцию get_contracts_by_region. Пора бы ее переименовать в просто get_contracts, ведь мы уже знаем, что можем получать контракты по любым поисковым параметрам. Перенесем сегодняшнюю функцию get_week наверх и продолжим.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/22c965de127144b8be04d0ff077bd96d-1200xautopx_1x.png)
Вместо supplierinn в запросе get_contracts укажем date_range и добавим значение из функции get_week. И поменяем еще кое-что — поскольку мы отсчитываем неделю назад, в f-строке функции get_week нужно поменять местами start_date и end_date.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/3bc9e0e56fc947edba313f6d3f9fbfb1-1200xautopx_1x.png)
Пора проверить, как отработает наша функция. Передадим в функцию get_contracts временной промежуток в виде недели от дня записи урока и увидим в терминале, что параметр signDate вписывается в указанный нами временной промежуток.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/b6ca3535045442faacf9a58738387617-1200xautopx_1x.png)
И напоследок узнаем, как отработает функция, если указать ей конкретную дату, от которой нужно отсчитать неделю — пусть это будет 1 мая 2021 года. Если вы все сделали по инструкции, то параметр signDate впишется в неделю до 1 мая.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/9d77552d4c364815aef277c3e08d5557-1200xautopx_1x.png)
Сегодня мы научились брать даты в виде строчки, делать их объектом библиотеки, отсчитывать временные шаги вперед или назад и использовать эти знания для нашего будущего робота (представляете, мы уже почти дописали его!). Как всегда, ждем ваши вопросы в нашем чате в Telegram.