5 приемов при работе с модулем datetime в Python



Сегодня посмотрим на Python-библиотеку datetime - незаменимый набор инструментов для обработки данных с датой и временем. Я дам обзор пяти основных приемов этой библиотеки, которые закроют большинство ваших проблем при обработки дат и времени. Поехали!



Понимание что такое объект datetime в Python.




Прежде чем приступить к разбору самих приемов полезно посмотреть, как устроены дата и время в datetime. Основным строительным блоком является объект datetime. И вполне логично, что это комбинация объекта даты и объекта времени (привет, кэп Очевидность!) Объект даты - это просто набор значений года, месяца, дня плюс набор функций, которые умеют их обрабатывать. Аналогичным образом устроен объект времени. Он включает значения часа, минут, секунд, микросекунд и часового пояса. Любое время может быть представлено соответствующим выбором этих значений.

1. combine()

import datetime
# (часы, минуты)
start_time = datetime.time(20, 0)
# (год, месяц, день)
# Создаем объект datetimet
start_datetime = datetime.datetime.combine(start_date, start_time)
  Первый прием при работе с датами - это возможность создавать их, комбинируя объекты даты и времени. В коде выше мы начинаем с создания времени, передавая ему значения в 20 часов и 0 минут. Поскольку мы не указали секунду или микросекунду, предполагается, что они равны нулю. Затем мы создаем дату, передавая год, месяц и день. Имеем 1 июня 2020 года
Создать объект datetime просто. Мы используем функцию comb () и передаем ей объект date и объект time, из которых мы хотим построить наше datetime.
Из-за похода к неймингу вызов функций пакета datetime могут сбивать с толку. Во-первых, datetime - это имя самой библиотеки(или еще называют пакета). Во-вторых datetime - это также имя модуля внутри пакета и, в-третьих, datetime - это уже тип самого объекта. Поэтому, когда мы объединяем нашу дату и время, мы вызываем его с таким задвоенным префиксом datetime.datetime. Первое datetime ссылается на пакет, второе datetime ссылается на модуль, а comb () - это функция внутри этого модуля.

2. timedelta

# Разница между datetimes -это объекты типа timedelta
timedelta_total = end_datetime - start_datetime
# timedelta состоят из дней, секунд и микросекунд
end_datetime = start_datetime + timedelta_total

  Второй прием для работы с датами - это тип, называемый timedelta. Он представляет собой разницу между двумя датами. Timedelta имеет всего три значения: дни, секунды и микросекунды. Таким образом можно однозначно представить разницу между любыми двумя датами.
Объекты c типом timedelta невероятно полезны, потому что они позволяют нам выполнять простую арифметику сложения и вычитания с датами. Они избавляют нас от необходимости думать о таких вещах, как количество дней в месяце, сколько секунд в дне или в високосном годе.

3. Timestamps

# Число секунд с 12:00 час. 1-го Января 1970, UTC
unix_time = timestamp(start_datetime)
start_datetime = fromtimestamp(1457453760)

  Третий прием для максимально эффективного использования даты - использование меток времени (timestamps). Для компьютеров работать с днями, часами, минутами и секундами неудобно. Чтобы упростить работу с датами и временем, было создано понятие UNIX-времени. Это количество секунд, прошедших с 00:00 1 января 1970 г. по всемирному координированному времени (часовой пояс UTC +0). Это позволяет представить любую дату и время одним, обычно интерпретируемым числом с плавающей запятой. Единственный недостаток в том, что он не интуитивно понятен человеку. Функции timestamp () и fromtimestamp () позволяют преобразовывать наш понятный человеком объект datetime в UNIX-timestamp и обратно для простоты вычислений.

4. weekday () и isoweekday ()

# Выводит порядковый номер дня недели
# Понедельник - 0, Воскресенье - 6
weekday_number = start_datetime.date().weekday()

  Наш четвертый прием - это функция weekday (). Для любой даты вычисляется день недели. Чтобы использовать его, вызовите функцию date () в объекте datetime. Это изолирует объект даты и игнорирует его временную часть. А затем вызовите его функцию weekday (). Она возвращает число от 0 до 6, где ноль - понедельник, один - вторник и т.д., а шесть - воскресенье. Если вам нужна более человеческая нумерация дней недели, где 1-это понедельник, а 7 - это воскресенье, то используйте функцию isoweekday () - она вернет порядковый номер дня недели в более привычной нотации

5. Преобразование в строчный формат

# Переводит строку в объект datetime
new_datetime = datetime.datetime.strptime(
'2020-07-31', '%Y-%m-%d')
# И обратно - из datetime в строку
datestr = new_datetime.strftime('%Y-%m-%d')
print(datestr)

>> "2020-07-31"
  Последний на сегодня прием, который заключается в преобразовании даты в строку и обратно. Это бывает полезно, когда мы получаем данные из текстового файла и хотим переделать текстовые даты в объекты datetime. А также и обратно, когда нужно показать наш объект datetime пользователю или экспортировать его в текстовый файл.

Для этого мы будем использовать функции strptime () и strftime (). При преобразовании в любом направлении мы должны предоставить некий шаблон, определяющий формат конечного результата. В фрагменте кода выше «% Y» представляет год, «% m» - месяц из двух цифр, а «% d» - день из двух цифр. Вот еще список значений для шаблона:

%A - полное название дня недели(Понедельник, Вторник)

%B - полное название месяца (Январь, Февраль)

%H - часы в 24-х часовом формате

%y - последний две цифры года(18, 19, 20)

Полный список кодов форматирования можно найти по этой ссылке

Кстати, на самом деле существует один правильный способ представления лет, месяцев и дней в датах: «ГГГГ-ММ-ДД». (Международный стандарт ISO 8601 установил это в 1988 г.) В этом формате, например, 31 июля 2020 г. будет «2020-07-31». Поэтому, ни российский вариант “31.07.2020”, ни американский вариант “07.31.2020” не являются верными с точки зрения соблюдения стандартов. Я рекомендую всякий раз, когда вам предоставляется выбор, форматировать даты именно в международном стандарте. Так вы сможете избежать некоторых проблем. связанных с совместимостью вашего кода.

Заключение

Итак, теперь вы вооружены пятью полезными приемами при работе с датами и временем:
  1. combine()
  2. timedelta
  3. Преобразование в timestamp
  4. weekday()/isoweekday()
  5. Строчное форматирование

Комментарии

Популярные сообщения из этого блога

Быстрый импорт в базу данных с помощью DBeaver

Jupyter-фишки, которые облегчат жизнь аналитику

Два способа загрузить свой датасет в Python

Чистка и препроцессинг данных. Готовим датасет для ML.