{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Задания для самостоятельного выполнения (блок 3, модули)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Задание 1\n",
"\n",
"В Python есть удобные инструменты для работы с датами в любом формате. Например, следующие стандартные форматы дат хорошо распознаются стандартными инструментами вроде Excel: `09.05.2019, 2018-12-31`. Но в большинстве случаев даты будут поступать в совершенно любых вариантах. Примеры популярных форматов из баз данных и API:\n",
"\n",
"* `2019-05-09Z15:34:55`;\n",
"* `19 Apr 19, Fri, 01:27:34.112`;\n",
"* `11:34 PM\"`.\n",
"\n",
"В каждом из этих примеров надо распознать дату и время — указать системе, где стоит год, где день и секунды. \n",
"\n",
"### Работа с датами на практике\n",
"\n",
"Даты встречаются в большинстве данных, с которыми вам придётся работать на практике. Рассмотрим одну из таких задач.\n",
"\n",
"Вам приходит ежедневный отчёт по доходам проекта. Как правило, системы, предоставляющие финансовые данные, обновляют эту информацию в течение нескольких дней, то есть данные по доходам за вчерашний день будут немного корректироваться в течение 2-3 дней. В таких случаях хорошей практикой является обновление связанных отчётов не только за вчерашний день, но и за несколько предыдущих. Иначе отчёт будет расходиться с реальными финансовыми показателями.\n",
"\n",
"В таком случае необходимо задавать окно дат за последние несколько дней и запускать формирование отчёта за каждый из них. Например, если сегодня 2 марта, то пересчёт нужно запускать за последние 2 дня февраля и 1 марта. При этом нужно учитывать возможный високосный год. Для решения таких задач в Python есть множество готовых инструментов. Перед тем как познакомиться с ними, рассмотрим очень важный вопрос формата даты и времени.\n",
"\n",
"### Форматы дат и времени\n",
"\n",
"В жизни мы привыкаем видеть даты в привычных для нас форматах. Например, запись `01.12.18` обычно означает `1 декабря 2018 года`. Однако для жителей США эта дата окажется `12 января 2018 года`, так как для них привычнее сначала указывать номер месяца, а потом день. Excel с настройками для России распознает эту дату как `1 декабря`, а в американской локализации — как `12 января`.\n",
"\n",
"Многие выгрузки из систем и баз данных имеют свой служебный формат. Например, формат времени из разных систем может отличаться:\n",
"\n",
"* `2018-11-09 15:45:21`;\n",
"* `11/09/2018 3:45:20 PM`;\n",
"* `2018-11-09T15:45:21.2984`.\n",
"\n",
"Для всех этих случаев необходимо задавать формат распознавания дат, уметь сравнивать их между собой. Также часто необходимо корректно прибавлять к датам различные временные интервалы. Например, час или день.\n",
"\n",
"### Формат YYYY-MM-DD\n",
"\n",
"Для распознавания дат в Python введены обозначения, которые помогут системе правильно распознать практически любой формат даты и времени. Для этого необходимо указать в коде, что означает каждая цифра и буква. \n",
"\n",
"Рассмотрим простой пример, когда дата задана в следующем формате:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"date_string = '2019-03-01'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Распознавание дат в Python\n",
"\n",
"Вернемся к переменной `date_string`. Что нужно, чтобы Python начал воспринимать эту строку как дату? Для начала необходимо явно указать, где в этой строке год, месяц и день:\n",
"\n",
"* `2019 — год`;\n",
"* `03 — месяц`;\n",
"* `01 — день`.\n",
"\n",
"А также не забыть, что в такой записи между ними стоят дефисы «-». Для расшифровки даты и времени составлены таблицы:\n",
"\n",
"* [официальная документация](https://docs.python.org/3/library/datetime.html) (таблица внизу страницы по ссылке);\n",
"* [вариант с русским переводом](https://all-python.ru/osnovy/modul-datetime.html) (таблица внизу страницы по ссылке).\n",
"Вместо чисел в переменной `date_string` надо подставить подходящие форматы из таблицы. Начнем с года: в таблице есть два варианта года:\n",
"\n",
"* `%y` — номер года без указания столетия (например, 19 для года 2019);\n",
"* `%Y` — полный вариант записи (2019), который нам подходит.\n",
"\n",
"Подставляем вместо года его формат: `'%Y-03-01'`\n",
"\n",
"Теперь месяц. Видим в таблице три варианта:\n",
"\n",
"* `%b` — сокращенное название месяца вроде Jan, Feb;\n",
"* `%B` — полное название месяца;\n",
"* `%m` — номер месяца в числовом представлении (наш вариант).\n",
"\n",
"Добавляем расшифровку месяца: `'%Y-%m-01'`\n",
"\n",
"Формат даты зависит от регистра: `%m` — номер месяца, а `%M` будет количеством минут.\n",
"\n",
"### Сложные форматы даты и времени\n",
"\n",
"В Python можно распознать любой тип даты.\n",
"\n",
"Давайте укажем формат даты `2019-04-01T06:30:00 (6:30 утра 1 апреля 2019 года)`. Год, месяц и день мы уже расшифровали — их формат `%Y-%m-%d`.\n",
"\n",
"Далее идёт буква `T`, как и любой символ в дате его надо указать в формате: `%Y-%m-%dT06:30:00`.\n",
"\n",
"Далее идет номер часа: в таблице два варианта:\n",
"\n",
"* `%H` — количество часов в 24-часовом формате;\n",
"* `%I` — количество часов в 12-часовом формате.\n",
"\n",
"Нам подходят оба варианта. Для того, чтобы узнать точный вариант, необходимо выяснить пример даты после полудня. Используем вариант `%H`.\n",
"\n",
"### Формат unixtime\n",
"\n",
"Популярным форматом записи даты и времени является `unixtime` (также POSIX-время). Это количество секунд, прошедших с полуночи `1 января 1970 года` по часовой зоне UTC. Преимущество данного формата в его простоте: обычно это целое число. Также им удобно считать разницу между двумя датами: это будет разница двух чисел в секундах.\n",
"\n",
"Переводить дату в unixtime и обратно можно с помощью кода на Python или специальных онлайн-сервисов, например, [onlineconversion](http://www.onlineconversion.com/unix_time.htm). На этом сайте используется американский формат ввода дат: сначала указывается месяц, потом день.\n",
"\n",
"### Упражнения\n",
"Вам предложены значения даты и времени, записанные в различных форматах: расшифруйте их. Будьте внимательны при указании формата часа.\n",
"\n",
"Пример задания:\n",
"\n",
"`2019-01-01 (1 января 2019 года)`\n",
"\n",
"Верный ответ:\n",
"\n",
"`%Y-%m-%d`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Упражнение 1\n",
"\n",
"12.23.2018\n",
"\n",
"(23 декабря 2018 года)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# здесь решение"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Упражнение 2\n",
"\n",
"01.13.2019Z15:39:01\n",
"\n",
"(13 января 2019 года, 15 часов 39 минут 1 секунда)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# здесь решение"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Упражнение 3\n",
"\n",
"23:45\n",
"\n",
"(23 часа 45 минут)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# здесь решение"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Библиотека datetime\n",
"\n",
"Теперь, когда мы научились работать с форматами даты и времени в Python, можно познакомиться с библиотеками, которые позволяют получать массу полезной информации из этих данных. Начнем с небольшого замечания об импорте библиотеки `datetime`, который можно сделать двумя способами. Можно импортировать ее в код так:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"import datetime"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"На текущем занятии мы будем использовать из этой библиотеки следующие модули:\n",
"\n",
"* `datetime` для распознавания формата дат,\n",
"* `timedelta` для прибавления к текущей дате определенного временного интервала.\n",
"\n",
"Импортируем эти модули следующим образом:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from datetime import datetime, timedelta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Это избавит нас от необходимости писать `datetime.` перед каждым вызовом модулей."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Перевод строки в дату\n",
"\n",
"До этого шага мы работали с датами как с обычными строками. Пора начать использовать полученные знания для практических задач, а именно переводить дату в виде строки в переменную типа `datetime`. Это позволит нам использовать многочисленные возможности работы с датами: выделять из даты любой период (день, секунду), прибавлять и вычитать временные интервалы (например, вычитать из 1 марта 1 день с учетом високосных годов) и многое другое.\n",
"\n",
"Возьмём строку:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"date_string = '05.05.2019 21:00'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для перевода этой строки в дату используется метод `strptime`:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2019, 5, 5, 21, 0)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt = datetime.strptime(date_string, '%d.%m.%Y %H:%M')\n",
"dt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Мы получили переменную типа `datetime`, и в качестве первого действия можно сразу получить год, день, час и другие характеристики даты и времени:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"21"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt.hour"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Перевод даты в строку\n",
"\n",
"Перед тем, как рассматривать другие практические применения типа переменных `datetime`, рассмотрим обратный процесс перевода даты в строку. Эта операция будет часто встречаться, так как результаты работы с датами обычно записываются в файлы как строки в удобном формате. Для этого действия предназначен метод `strftime`, который похож на `strptime` из прошлого шага.\n",
"\n",
"Зададим значение `dt` из прошлого шага ещё раз, не обязательно для этого использовать перевод из строки, можно задать дату и время напрямую:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"dt = datetime(2019, 5, 5, 21, 0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Как видно из синтаксиса, порядок следования периодов логичен: год, номер месяца, день, часы, минуты, секунды (не обязательно указывать все аргументы, но важно сохранять их порядок). Теперь для перевода даты `dt` в строку достаточно указать желаемый формат. Используем стандартный формат `YYYY-MM-DD`:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2019-05-05'"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt.strftime('%Y-%m-%d')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Упражнение 4\n",
"Дана строка с датой `date_string = '2019-07-07T18:59:33'`\n",
"\n",
"Преобразуйте ее в строку с форматом `%d.%m.%Y`. Результат запишите в переменную `date_format`"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"from datetime import datetime\n",
"date_string = '2019-07-07T18:59:33'\n",
"\n",
"# здесь решение"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Задание 2\n",
"\n",
"В блокнотах CoLab можно вычислять время выполнения инструкций:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.19 ns ± 0.0301 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)\n"
]
}
],
"source": [
"%timeit 456**3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Определите время вычисления произвольных инструкций."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# здесь код"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}