При работе со скриптами, для которых нужно получать данные в реальном времени, рекомендую использовать модуль dateutil. Он помогает планировать, получать данные в определенное время или устанавливать временные метки.
Работать с датой и временем с помощью встроенного модуля datetime в большом проекте — непростая задача. Учитывая количество изменений, которые требуется применить, при получении «сырых» данных.
Для этих целей был создан модуль dateutil. Он предоставляет расширения для методов, уже имеющихся в datetime.
Установка модуля dateutil в Python
Прежде чем начинать работать с модулем dateutil нужно его установить с помощью следующей строки:
pip install python-dateutil
В этом примере используется пакетный менеджер pip, но ничего не мешает использовать Anaconda.
Работа с модулем
После установки можно начинать работать с самим модулем.
Dateutil разбит на несколько подклассов:
easter,
parser,
relativedelta,
rrule,
tz
и некоторые другие.
Их не так много, но в этом материале разберем лишь некоторые из них.
Импорт нужных методов
После установки модуля нужно выбрать требуемые методы. В верхней части кода нужные элементы сперва необходимо импортировать.
# нужно импортировать модуль datetime
from datetime import datetime, date
from dateutil.relativedelta import relativedelta, FR, TU
from dateutil.easter import easter
from dateutil.parser import parse
from dateutil import rrule
Это позволит использовать их для запуска примеров.
Datetime и relativedata
Итак, dateutil зависит от модуля datetime. Он использует его объекты.
Подкласс relativedelta расширяет возможности модуля datetime, предоставляя функции для работы с датами и временем относительно полученных данных.
Это значит, что вы можете добавлять дни, месяца и года к текущему объекту datetime. Также есть возможность работать с интервалами.
# Создание нескольких объектов datetime для работы
dt_now = datetime.now()
print("Дата и время прямо сейчас:", dt_now)
dt_today = date.today()
print("Дата сегодня:", dt_today)
Дата и время прямо сейчас: 2021-02-06 12:06:58.192574
Дата сегодня: 2021-02-06
Попробуем поработать с полученной информацией с помощью относительных дат.
# Следующий месяц
print(dt_now + relativedelta(months=+1))
# Следующий месяц, плюс одна неделя
print(dt_now + relativedelta(months=+1, weeks=+1))
# Следующий месяц, плюс одна неделя, в 17:00.
print(dt_now + relativedelta(months=+1, weeks=+1, hour=17))
# Следующая пятница
print(dt_today + relativedelta(weekday=4))
# Узнаем последний вторник месяца
print(dt_today + relativedelta(day=31, weekday=TU(-1)))
# Мы также можем напрямую работать с объектами datetime
# Пример: Определение возраста.
birthday = datetime(1965, 12, 2, 12, 46)
print("Возраст:", relativedelta(dt_now, birthday).years)
Например, в примере выше удалось получить years объекта relativedelta.
2021-02-23
Возраст: 55
К тому же с полученным объектом можно проводить самые разные манипуляции.
Datetime и easter
Подкласс easter используется для вычисления даты и времени с учетом разных календарей.
Этот подкласс довольно компактный и включает всего один аргумент с тремя вариантами:
print(parse("Thu Sep 25 10:36:28 BRST 2003"))
# Мы также можем игнорировать часовой пояс
print(parse("Thu Sep 25 10:36:28 BRST 2003", ignoretz=True))
# Мы можем не указывать часовой пояс или год.
print(parse("Thu Sep 25 10:36:28"))
# Мы можем подставить переменные
default = datetime(2020, 12, 25)
print(parse("10:36", default=default))
Его можно использовать с разными явными аргументами, например, часовыми поясами. А с помощью переменных разные элементы можно удалить из финального результата.
# Вывод 5 дней от даты старта
print(list(rrule.rrule(rrule.DAILY, count=5, dtstart=parse("20201202T090000"))))
# Вывод 3 дней от даты старта с интервалом 10
print(list(rrule.rrule(rrule.DAILY, interval=10, count=3, dtstart=parse("20201202T090000"))))
# Вывод 3 дней с интервалом неделя
print(list(rrule.rrule(rrule.WEEKLY, count=3, dtstart=parse("20201202T090000"))))
# Вывод 3 дней с интервалом месяц
print(list(rrule.rrule(rrule.MONTHLY, count=3, dtstart=parse("20201202T090000"))))
# Вывод 3 дней с интервалом год
print(list(rrule.rrule(rrule.YEARLY, count=3, dtstart=parse("20201202T090000"))))
Важная особенность модуля dateuitl — возможность работать с запланированными задачами и функциями календаря с помощью этого подкласса.