Найти тему
Калинкин

Как работать с датой и временем в Python

Оглавление
Дата и время в Python
Дата и время в Python

Работа с данными даты и времени в Python является важным навыком. В этой статье будут продемонстрированы наиболее важные модули даты и времени Python.

Есть несколько удобных модулей Python, которые предоставляют функциональность, упрощающую работу с датами и временем. Ранее мы обсуждали некоторые отличные библиотеки, которые может предложить Python; в этой статье мы представим (с примерами) некоторые из наиболее полезных инструментов для обработки дат и времени.

Модуль time

Первый модуль называется time и поставляется со стандартной установкой Python. Давайте начнем с получения текущего времени:

import time
time_now = time.time()
print(time_now)
#Результат: 1682873105.885011

Попробуйте это сами. Полученный вами результат будет меняться в зависимости от того, когда вы выполните эту команду. Однако эта команда возвращает очень большое число. Это время (в секундах), прошедшее с момента отсчета времени, или ‘эпохи’. Для большинства систем эпохой считается четверг, 1 января 1970 года, 00:00:00 UTC. Даты и времена до этой эпохи выражаются в виде отрицательного числа. Отображение времени в секундах с 1970 года не особенно полезно, поэтому его можно отобразить в виде предварительно отформатированной строки:

import time
time_now = time.time()
print(time.ctime(time_now))
#Результат: Sun Apr 30 19:48:32 2023

Здесь мы использовали ctime() метод для преобразования прошедших секунд в более привычный формат.

time()Функция может использоваться для проверки времени выполнения блока кода, что может быть очень ценной информацией при написании более сложных программ.

Модуль calendar

calendar Модуль предоставляет функции, связанные с выводом календарей. Это также поставляется со стандартной установкой Python.

calendar() Функция просто печатает календарь за весь год. Просто укажите год в виде целого числа в качестве первого аргумента. Выходные данные представляют собой строку с пробелами и символами новой строки для удобного отображения календаря. Аналогично, month() функция принимает год и месяц в качестве целочисленных аргументов и выводит календарь на этот месяц.

Если вы протестируете эти функции, то заметите, что в календарях в качестве первого дня недели используется понедельник с индексом 0. Вы можете получить номер дня недели, от 0 до 6, для любой даты, используя weekday() функцию. Этот стандарт начала недели с понедельника с индексом 0 также используется в других модулях Python.

Calendar Класс включает в себя несколько итераторов, которые вы можете использовать для перебора дней недели и месяцев года. Существует также TextCalendar и HTMLCalendar класс, который может генерировать обычный текст и HTML-календари. Еще раз, ознакомьтесь с ДОКУМЕНТАЦИЕЙ для получения более подробной информации об этом модуле.

Модуль datetime

С помощью datetime модуля вы можете определять даты и время как объект. Как указано в ДОКУМЕНТАЦИИ, основное внимание в этом модуле уделяется эффективному извлечению атрибутов для отображения datetime объектов и манипулирования ими. Но этим дело не ограничивается; вы также можете использовать его для вычисления количества дней между двумя датами. Чтобы определить объект datetime, импортируйте модуль и выполните следующие действия:

import datetime
date1 = datetime.datetime(2022, 1, 1, 12, 30, 0)

Аргументы определяют дату от года до микросекунды, причем year, month и day являются обязательными аргументами. Вы также можете при желании включить информацию о часовом поясе при определении datetime объекта. Если вы попытаетесь определить недопустимую дату, например, с аргументом day = 35, вы получите ValueError: day is out of range for month.

datetimeОбъект имеет множество методов, связанных с ним. Вы можете получить год с помощью date1.year, которая возвращает целое число. Это также работает для другой информации о дате и времени с точностью до микросекунды. Как мы обсуждали ранее, день недели (как целое число от 0 до 6) может быть получен с помощью weekday() функции:

print(date1.weekday())

Целое число 5 соответствует субботе. Вы можете дважды проверить это, распечатав календарь с помощью calendar модуля. Попробуйте сами.

Давайте создадим другой datetime объект:

date2 = datetime.datetime(2021, 7, 31)

Разницу между двумя датами можно легко вычислить и распечатать:

time_diff = date1 - date2
print('Number of days between %s and %s = %s'%(date1, date2, time_diff.days))

При этом создается новый timedelta объект, который представляет длительность. Мы использовали days() метод, чтобы получить разницу во времени в днях, затем напечатали ответ. Даже если разница во времени составляет несколько лет, самое грубое разрешение timedelta объекта будет в днях.

В приведенном выше примере мы просто отобразили объект с помощью print() функции. Формат по умолчанию, когда объект печатается таким образом, является ГГГГ-ММ-ДД ЧЧ: ММ:СС. datetime Модуль поставляется с некоторыми удобными функциями, помогающими форматировать и отображать объекты. Например, strftime() это метод экземпляра, который позволяет создавать строковое представление datetime объекта. Вот несколько примеров того, как использовать строки разного формата для печати информации о дате и времени с помощью этого метода:

import datetime
date1 = datetime.datetime(2023, 1, 1, 12, 30, 0)
print(date1.strftime('%Y %m %d'))
print(date1.strftime('%Y-%m-%d'))
print(date1.strftime('%A %d %B %Y'))
print(date1.strftime('%a %d %b %y, %H:%M:%S %p'))

Существует еще много вариантов форматирования выходной строки даты / времени. Взгляните на КОДЫ ФОРМАТА для некоторого вдохновения.

С этим связан метод класса strptime(). Это делает обратное предыдущему примеру, а именно переходит от строки к datetime объекту. Этот метод имеет два обязательных аргумента: строку даты и строку формата. Вы используете те же коды формата, что и упомянутые выше. Вот пример:

import datetime
date3 = datetime.datetime.strptime('2023-01-01', '%Y-%m-%d')
print(date3)

Работа в разных часовых поясах

Последняя функция, которую мы продемонстрируем, - это как обрабатывать часовые пояса. При создании datetime объекта вы можете определить часовой пояс с помощью библиотеки PYTZ. Для получения полного списка часовых поясов просто выполните pytz.common_timezones в терминале, который напечатает список строк. Мы можем выбрать несколько часовых поясов и проверить текущее время:

import datetime
import pytz
time_zones = ['europe/moscow', 'America/New_York', 'Asia/Seoul', 'Australia/Melbourne', 'Europe/Zagreb']
for time_zone in time_zones:
print(datetime.datetime.now(tz=pytz.timezone(time_zone)))

Имейте ввиду что для работы с часовыми поясами нужно загрузить себе библиотеку Pytz, вот пример инсталляции через терминал:

pip install pytz

Эти datetime объекты теперь "ОСОЗНАЮТСЯ’ и могут хорошо взаимодействовать только с другими объектами, учитывающими часовой пояс. Попробуйте вычислить разницу во времени между осознающим и наивным объектом, и вы получите TypeError.