Основные возможности модуля dateutil

При работе со скриптами, для которых нужно получать данные в реальном времени, рекомендую использовать модуль 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))
2021-03-06 12:11:53.648565
2021-03-13 12:11:53.648565
2021-03-13 17:11:53.648565
2021-02-12

С помощью базовых операций можно получить самую разную информацию.

# Узнаем последний вторник месяца
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 используется для вычисления даты и времени с учетом разных календарей.

Этот подкласс довольно компактный и включает всего один аргумент с тремя вариантами:

  • Юлианский календарь EASTER_JULIAN=1.
  • Григорианский календарь EASTER_ORTHODOX=2.
  • Западный календарь EASTER_WESTERN=3.

Вот как это будет выглядеть в коде:

print("Юлианский календарь:", easter(2021, 1))
print("Григорианский календарь:", easter(2021, 2))
print("Западный календарь:", easter(2021, 3))
Юлианский календарь: 2021-04-19
Григорианский календарь: 2021-05-02
Западный календарь: 2021-04-04

Datetime и parser

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

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))

Его можно использовать с разными явными аргументами, например, часовыми поясами. А с помощью переменных разные элементы можно удалить из финального результата.

2003-09-25 10:36:28
2003-09-25 10:36:28
2021-09-25 10:36:28
2020-12-25 10:36:00

Datetime и rrule

Подкласс rrule использует пользовательский ввод для предоставлении информации о повторяемости объекта datetime.


# Вывод 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 — возможность работать с запланированными задачами и функциями календаря с помощью этого подкласса.

[datetime.datetime(2020, 12, 2, 9, 0), datetime.datetime(2020, 12, 3, 9, 0), datetime.datetime(2020, 12, 4, 9, 0), datetime.datetime(2020, 12, 5, 9, 0), datetime.datetime(2020, 12, 6, 9, 0)]
[datetime.datetime(2020, 12, 2, 9, 0), datetime.datetime(2020, 12, 12, 9, 0), datetime.datetime(2020, 12, 22, 9, 0)]
[datetime.datetime(2020, 12, 2, 9, 0), datetime.datetime(2020, 12, 9, 9, 0), datetime.datetime(2020, 12, 16, 9, 0)]
[datetime.datetime(2020, 12, 2, 9, 0), datetime.datetime(2021, 1, 2, 9, 0), datetime.datetime(2021, 2, 2, 9, 0)]
[datetime.datetime(2020, 12, 2, 9, 0), datetime.datetime(2021, 12, 2, 9, 0), datetime.datetime(2022, 12, 2, 9, 0)]

Выводы

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

Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
admin@pythonru.comAlex Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScript