{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Задания для самостоятельного выполнения (блок 3, модули)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Open" ] }, { "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 }