В Python есть удобные инструменты для работы с датами в любом формате. Например, следующие стандартные форматы дат хорошо распознаются стандартными инструментами вроде Excel: 09.05.2019, 2018-12-31
. Но в большинстве случаев даты будут поступать в совершенно любых вариантах. Примеры популярных форматов из баз данных и API:
2019-05-09Z15:34:55
;19 Apr 19, Fri, 01:27:34.112
;11:34 PM"
.В каждом из этих примеров надо распознать дату и время — указать системе, где стоит год, где день и секунды.
Даты встречаются в большинстве данных, с которыми вам придётся работать на практике. Рассмотрим одну из таких задач.
Вам приходит ежедневный отчёт по доходам проекта. Как правило, системы, предоставляющие финансовые данные, обновляют эту информацию в течение нескольких дней, то есть данные по доходам за вчерашний день будут немного корректироваться в течение 2-3 дней. В таких случаях хорошей практикой является обновление связанных отчётов не только за вчерашний день, но и за несколько предыдущих. Иначе отчёт будет расходиться с реальными финансовыми показателями.
В таком случае необходимо задавать окно дат за последние несколько дней и запускать формирование отчёта за каждый из них. Например, если сегодня 2 марта, то пересчёт нужно запускать за последние 2 дня февраля и 1 марта. При этом нужно учитывать возможный високосный год. Для решения таких задач в Python есть множество готовых инструментов. Перед тем как познакомиться с ними, рассмотрим очень важный вопрос формата даты и времени.
В жизни мы привыкаем видеть даты в привычных для нас форматах. Например, запись 01.12.18
обычно означает 1 декабря 2018 года
. Однако для жителей США эта дата окажется 12 января 2018 года
, так как для них привычнее сначала указывать номер месяца, а потом день. Excel с настройками для России распознает эту дату как 1 декабря
, а в американской локализации — как 12 января
.
Многие выгрузки из систем и баз данных имеют свой служебный формат. Например, формат времени из разных систем может отличаться:
2018-11-09 15:45:21
;11/09/2018 3:45:20 PM
;2018-11-09T15:45:21.2984
.Для всех этих случаев необходимо задавать формат распознавания дат, уметь сравнивать их между собой. Также часто необходимо корректно прибавлять к датам различные временные интервалы. Например, час или день.
Для распознавания дат в Python введены обозначения, которые помогут системе правильно распознать практически любой формат даты и времени. Для этого необходимо указать в коде, что означает каждая цифра и буква.
Рассмотрим простой пример, когда дата задана в следующем формате:
date_string = '2019-03-01'
Вернемся к переменной date_string
. Что нужно, чтобы Python начал воспринимать эту строку как дату? Для начала необходимо явно указать, где в этой строке год, месяц и день:
2019 — год
;03 — месяц
;01 — день
.А также не забыть, что в такой записи между ними стоят дефисы «-». Для расшифровки даты и времени составлены таблицы:
Вместо чисел в переменной date_string
надо подставить подходящие форматы из таблицы. Начнем с года: в таблице есть два варианта года:
%y
— номер года без указания столетия (например, 19 для года 2019);%Y
— полный вариант записи (2019), который нам подходит.Подставляем вместо года его формат: '%Y-03-01'
Теперь месяц. Видим в таблице три варианта:
%b
— сокращенное название месяца вроде Jan, Feb;%B
— полное название месяца;%m
— номер месяца в числовом представлении (наш вариант).Добавляем расшифровку месяца: '%Y-%m-01'
Формат даты зависит от регистра: %m
— номер месяца, а %M
будет количеством минут.
В Python можно распознать любой тип даты.
Давайте укажем формат даты 2019-04-01T06:30:00 (6:30 утра 1 апреля 2019 года)
. Год, месяц и день мы уже расшифровали — их формат %Y-%m-%d
.
Далее идёт буква T
, как и любой символ в дате его надо указать в формате: %Y-%m-%dT06:30:00
.
Далее идет номер часа: в таблице два варианта:
%H
— количество часов в 24-часовом формате;%I
— количество часов в 12-часовом формате.Нам подходят оба варианта. Для того, чтобы узнать точный вариант, необходимо выяснить пример даты после полудня. Используем вариант %H
.
Популярным форматом записи даты и времени является unixtime
(также POSIX-время). Это количество секунд, прошедших с полуночи 1 января 1970 года
по часовой зоне UTC. Преимущество данного формата в его простоте: обычно это целое число. Также им удобно считать разницу между двумя датами: это будет разница двух чисел в секундах.
Переводить дату в unixtime и обратно можно с помощью кода на Python или специальных онлайн-сервисов, например, onlineconversion. На этом сайте используется американский формат ввода дат: сначала указывается месяц, потом день.
Вам предложены значения даты и времени, записанные в различных форматах: расшифруйте их. Будьте внимательны при указании формата часа.
Пример задания:
2019-01-01 (1 января 2019 года)
Верный ответ:
%Y-%m-%d
# здесь решение
# здесь решение
# здесь решение
Теперь, когда мы научились работать с форматами даты и времени в Python, можно познакомиться с библиотеками, которые позволяют получать массу полезной информации из этих данных. Начнем с небольшого замечания об импорте библиотеки datetime
, который можно сделать двумя способами. Можно импортировать ее в код так:
import datetime
На текущем занятии мы будем использовать из этой библиотеки следующие модули:
datetime
для распознавания формата дат,timedelta
для прибавления к текущей дате определенного временного интервала.Импортируем эти модули следующим образом:
from datetime import datetime, timedelta
Это избавит нас от необходимости писать datetime.
перед каждым вызовом модулей.
До этого шага мы работали с датами как с обычными строками. Пора начать использовать полученные знания для практических задач, а именно переводить дату в виде строки в переменную типа datetime
. Это позволит нам использовать многочисленные возможности работы с датами: выделять из даты любой период (день, секунду), прибавлять и вычитать временные интервалы (например, вычитать из 1 марта 1 день с учетом високосных годов) и многое другое.
Возьмём строку:
date_string = '05.05.2019 21:00'
Для перевода этой строки в дату используется метод strptime
:
dt = datetime.strptime(date_string, '%d.%m.%Y %H:%M')
dt
datetime.datetime(2019, 5, 5, 21, 0)
Мы получили переменную типа datetime
, и в качестве первого действия можно сразу получить год, день, час и другие характеристики даты и времени:
dt.hour
21
Перед тем, как рассматривать другие практические применения типа переменных datetime
, рассмотрим обратный процесс перевода даты в строку. Эта операция будет часто встречаться, так как результаты работы с датами обычно записываются в файлы как строки в удобном формате. Для этого действия предназначен метод strftime
, который похож на strptime
из прошлого шага.
Зададим значение dt
из прошлого шага ещё раз, не обязательно для этого использовать перевод из строки, можно задать дату и время напрямую:
dt = datetime(2019, 5, 5, 21, 0)
Как видно из синтаксиса, порядок следования периодов логичен: год, номер месяца, день, часы, минуты, секунды (не обязательно указывать все аргументы, но важно сохранять их порядок). Теперь для перевода даты dt
в строку достаточно указать желаемый формат. Используем стандартный формат YYYY-MM-DD
:
dt.strftime('%Y-%m-%d')
'2019-05-05'
Дана строка с датой date_string = '2019-07-07T18:59:33'
Преобразуйте ее в строку с форматом %d.%m.%Y
. Результат запишите в переменную date_format
from datetime import datetime
date_string = '2019-07-07T18:59:33'
# здесь решение
В блокнотах CoLab можно вычислять время выполнения инструкций:
%timeit 456**3
6.19 ns ± 0.0301 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
Определите время вычисления произвольных инструкций.
# здесь код