Дата и время в Питоне | Программирование на Питоне

Дата и время в Питоне

Все курсы > Программирование на Питоне > Занятие 5

Говоря про временные ряды, мы уже начали анализировать данные, в которых присутствует дата и время (в частности, в библиотеке Pandas). Сегодня мы сделаем шаг назад и посмотрим в целом как работать с датой и временем в Питоне.

Модуль datetime

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

Первая особенность, про которую стоит сказать, datetime — это не только название модуля, но и название одного из классов внутри этого модуля. Помимо класса datetime, нас будет интересовать ещё один класс — timedelta.

Перейдем к практике.

Откроем ноутбук к этому занятию

Импорт модуля и класса datetime

Самый простой способ — импортировать весь модуль datetime.

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

Как вы видите, это не очень удобно. Можно импортировать только класс datetime и обращаться непосредственно к нему.

Объект datetime и функция now()

Теперь поговорим подробнее про то, что выводит функция now().

На выходе мы получаем текущие дату и время по UTC⧉, потому что серверы Google Colab настроены именно на это время (московское время, например, отличается на +3 часа). Сам вывод состоит из следующих компонентов.

Мы можем обратиться к каждому из этих компонентов по отдельности.

Мы также можем посмотреть на день недели, причем в двух форматах. Метод .weekday() считает, что неделя начинается с нуля, метод .isoweekday(), что с единицы.

Так как 18 ноября 2021 года — это четверг, то применив эти методы, мы должны получить цифры три и четыре соответственно.

Разумеется, когда вы будете самостоятельно исполнять код в ноутбуке, будут выведены текущие дата и время сервера Google.

Объект datetime, полученный из функции now(), не содержит данных о часовом поясе.

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

Посмотрим, не появился ли часовой пояс.

Timestamp

До сих пор мы работали с привычным для нас делением на годы, месяцы, дни, часы, минуты и секунды. При этом компьютеры используют так называемое время Unix, которое отсчитывается в секундах c первого января 1970 года. Для отображения даты и времени в таком формате в Питоне есть объект timestamp (по-английски — «временная отметка»).

Посмотрим, сколько секунд и микросекунд прошло с 01.01.1970 и до момента исполнения кода.

Не составляет труда вернуть timestamp обратно в привычный формат.

Создание объекта datetime вручную

Дату и время не обязательно получать из функции now(). Мы вполне можем передать объекту datetime наши собственные параметры, например, день рождения Питона.

Обратите внимание, мы ввели только год, месяц и день. Это обязательные параметры. Остальные параметры можно не вводить, в этом случае они заполнятся нулями.

Из этого объекта мы также можем извлечь компоненты (год, месяц, число и т.д.) и создать timestamp.

Преобразование строки в datetime и наоборот

Строка в datetime через .strptime()

Если дата содержится в строковом формате, Питон не сможет извлечь из нее компоненты. Предварительно строку нужно преобразовать. Для этого есть метод .strptime().

Преобразуем эту строку в объект datetime с помощью метода .strptime().

Как вы видите, сначала мы передаём этому методу саму строку, а затем тот формат, в котором содержится дата и время (иначе Питон не поймет, к чему относится конкретное число).

Давайте расшифруем каждое из обозначений:

  • %Y — год в формате ГГГГ, например: 1995, 2003 и т.д.
  • %m — месяц в виде числа с нулями, например, январь — 01, февраль — 02 и т.д.
  • %d — день месяца в виде числа с нулями, например: 01, 02, …, 31
  • %H — час в 24-часовом формате в виде числа с нулями, например: 00, 01, …, 23
  • %M — минуты в виде числа с нулями, например: 00, 01, …, 59
  • %S — секунды в виде числа с нулями, например: 00, 01, …, 59

Дефисы, пробелы, двоеточия или, например, запятые — тоже элементы формата и их тоже нужно указывать.

Datetime в строку через .strftime()

Обратное преобразование также возможно. Это может быть полезно, если мы захотим вывести дату и время в строго определенном формате.

Метод .strftime() можно применять непосредственно к объекту datetime.

Расшифруем обозначения:

  • %A — полное название дня недели, например: Sunday, Monday, …
  • %B — полное название месяца, например: January, February
  • %d — день месяца в виде числа с нулями, например: 01, 02, …, 31
  • %Y — год в формате ГГГГ, например: 1999, 2003 и т.д.

Более подробный перечень обозначений можно найти в ноутбуке к занятию⧉.

Сравнение и арифметика дат

Сравнение дат

Даты можно сравнивать между собой. Для этого используются стандартные операторы сравнения >, <, >=, <=, ==, !=.

Обратите внимание, что большей считается более поздняя дата.

Сравним две даты публикации работ Эйнштейна.

Вторая дата должна быть «больше», потому что она более поздняя.

Обратное будет признано ложным.

Календарный и алфавитный порядок дат

Интересно, что если даты записаны в виде строки в формате ГГГГ.ММ.ДД, то в Питоне мы можем их сравнивать, как если бы мы сравнивали объекты datetime. Другими словами, календарный и алфавитный порядок дат совпадают. Приведем пример.

Промежуток времени и класс timedelta

Если из большей даты вычесть меньшую, то мы получим временной промежуток между датами.

При этом результат будет храниться в специальном объекте timedelta.

Атрибут days позволяет посмотреть только дни.

Объект timedelta также можно создать вручную.

Арифметика дат

Объединив объекты datetime и timedelta, мы можем «путешествовать во времени».

И мы хотим отправиться в 1 января 1900 года, т.е. на 170 лет назад.

Давайте посмотрим, сколько дней мы преодолели.

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

Теперь снова совершим путешествие во времени, но на этот раз укажем правильное количество дней.

Объект timedelta можно также прибавлять к объекту datetime. Например, нам может быть нужно создать перечень дат, пусть это будут новогодние празники в 2021 году. Для этого удобно использовать цикл while.

Дата и обработка ошибок

Конструкция try / except и оператор pass

Прежде чем мы перейдем к практическому примеру с обработкой дат, давайте познакомимся с одной полезной конструкцией. Часто мы не уверены, что наш код отработает без ошибок. Например, в данных может содержаться неточность, о которой мы ничего не знаем. При этом нам не хотелось бы, чтобы исполнение кода остановилось.

Для этого в Питоне есть конструкция try/except.

Приведем пример.

Если бы такой конструкции не было, при попытке прибавить букву «а» алгоритм вывел бы ошибку.

Оператор pass просто говорит алгоритму продолжить работу. Вместо него можно вывести предупреждение.

Примечание. Обратите внимание на запись \'{number}\'. Обратная косая черта необходима, чтобы Питон воспринимал кавычки как часть строки.

Обработка нескольких форматов дат

Теперь давайте посмотрим, как эта конструкция работает с датами. Вначале скачаем и подгрузим в Google Colab данные среднемесячной температуры в Нью-Йорке в 2002 году (в градусах Фаренгейта).

На данном этапе вы уже должны быть экспертами по работе с внешними данными.

Предположим, что мы хотим вручную преобразовать каждую дату из строки в объект datetime. Теперь допустим, что проанализировав данные, мы выявили три шаблона: ГГГГ.ММ.ДД, ГГГГ.ММ.Д и ГГГГ.ММ. Напишем код, который в цикле for преобразует эти даты в объект datetime. Дополнительно наш код должен посчитать количество не обработанных записей.

Как мы видим, один формат мы все же упустили (данные за ноябрь в формате ММ.ГГГГ), и Питон не смог обработать эту запись.

Эту же работу мы можем поручить библиотеке Pandas через функцию read_csv() и параметр parse_dates (мы уже делали так, изучая временные ряды).

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

Иногда, как мы видим, решение «из коробки» (то есть уже готовое решение) более эффективно, чем написанный самостоятельно код.

Подведем итог

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

  • Мы рассмотрели структуру объекта datetime
  • Узнали про функцию now()
  • Научились извлекать timestamp и вручную создавать объект datetime
  • Посмотрели, как преобразовывать строку в объект datetime и наоборот
  • Изучили возможности сравнения дат, вычисления промежутка между датами и выполнили несложную арифметику дат с помощью объекта timedelta
  • Наконец, мы познакомились с конструкцией try/except и оператором pass и применили их к обработке различных форматов дат

Вопросы для закрепления

С какими классами модуля datetime мы познакомились на этом занятии?

Посмотреть правильный ответ

Чему соответствует формат ‘%c’?

Посмотреть правильный ответ

Как еще в библиотеке Pandas мы можем превратить столбец в индекс и затем преобразовать в объект datetime? Подсказка: обратитесь к лекции по временным рядам.

Посмотреть правильный ответ

В ноутбуке к лекции приведены дополнительные упражнения⧉.

На следующем занятии мы поговорим про функции в Питоне.