129.77K
Категория: ПрограммированиеПрограммирование

Обработка дат и времени на Python. Тема 2.2

1.

Обработка дат и времени на
Python

2.

Для описания способов работы с датой и временем нам понадобится ряд понятий и терминов.
Класс – это описание реального объекта, включающее набор характеристик объекта и действий,
которые может осуществлять объект.В программировании характеристики объекта – это
переменные, а действия – это функции управления этими переменными. Переменные класса
называются атрибутами, а функции – методами.
Конкретным воплощением класса является объект. Создается объект при помощи специального
метода – конструктора. Имя конструктора совпадает с именем класса.
Для доступа к атрибутам класса используются специальные методы, которые называются
свойствами.
Вызов методов класса осуществляется через операцию «точка»: после имени объекта ставится
точка и после нее идет вызов метода.
Модулем (или библиотекой) называется любой файл с программой. Обычно модули включают в
себя функции и классы, относящиеся к одной тематике.
Для работы с датой и временем предназначены несколько модулей:
1. time – позволяет получить текущую дату и время, а также произвести форматированный вывод.
2. datetime – позволяет производить арифметические операции, сравнивать даты, выводить дату
и время в различных форматах.
3. calendar – позволяет вывести календарь в виде простого текста или HTML-формата.
4. timeit – позволяет измерить время выполнения небольших фрагментов кода с целью
оптимизации программы.
Далее подробно будет рассмотрен модуль datetime.

3.

Библиотека datetime
Основной функционал для работы с датами и временем
сосредоточен в модуле datetime.Нам понадобятся следующие
классы из этого модуля:
1. date – представление даты в виде объекта со стандартным
представлением даты (год, месяц, день).
2. time – представление времени в виде объекта со стандартным
представлением
времени
(часы,
минуты,
секунды,
микросекунды).
3. timedelta–дата в виде количества дней, секунд и микросекунд.
Обычно используется для задания интервала между двумя
моментами времени с точностью до микросекунд.
4. datetime – представление комбинации даты и времени в виде
объекта со стандартным представлением (год, месяц, день,
часы, минуты, секунды, микросекунды).

4.

Класс date
Для работы с датами воспользуемся классом date, который
определен в модуле datetime. Для создания объекта классаdate
мы можем использовать конструктор date, который
последовательно принимает три параметра: год, месяц и день
date(year, month, day)
Например, создадим какую-либо дату:
Import datetime
d = datetime.date(2022, 8, 20)
print(d)
Здесь в первой строке указывается инструкция для подключения
модуляdatetime. Во второй строке из модуля datetime через
точку вызывается конструктор date класса date с конкретными
параметрами 2022, 8, 20. В результате создается объект d.
Консольный вывод программы:
2022-08-20

5.

Если необходимо получить текущую дату, то можно
воспользоваться методом today():
fromdatetimeimport date
d = date.today()
print(d)
print(f"{d.day}.{d.month}.{d.year}")
В первой строке подключается не вся библиотекаdatetime, а
только класс date. Это позволяет при вызове методов этого
класса не указывать имя модуля. Во второй строке создается
объектd классаdateпри помощи метода today(). С помощью
свойств day, month, year можно получить соответственно день,
месяц и год, как это сделано в четвертой строке
представленнойпрограммы.
Консольный вывод программы:
2022-08-25
25.8.2022

6.

Класс time
За работу со временем отвечает класс time. Используя его конструктор, можно создать объект
времени:
time([hour] [, min] [, sec] [, microsec])
Конструктор последовательно принимает часы, минуты, секунды и микросекунды. Все параметры
необязательные, и если мы какой-то параметр не передадим, то соответствующее значение
будет инициализироваться нулем (в определении конструктора квадратные скобки
обозначают необязательность параметра).
from datetimeimport time
t = time()
print(t)
t1 = time(16, 25)
print(t1)
t2 = time(16, 25, 45)
print(t2)
В данной программе последовательно создается три объекта класса time с различными
параметрами. Консольный вывод программы:
00:00:00
16:25:00
16:25:45
Можно заметить, что в тех случаях, когда какой-то параметр не был указан в конструкторе,
соответствующий атрибут инициализирован нулем. При создании первого объекта в
конструкторе не указано ни одного параметра, соответственно часы, минуты, секунды равны
нулю. При создании второго объекта не нулевыми оказались только часы и минуты.

7.

Класс datetime
Класс datetime из одноименного модуля объединяет возможности
работы с датой и временем. Для создания объекта datetime
можно использовать следующий конструктор:
datetime(year, month, day [, hour] [, min] [, sec] [, microsec])
Первые три параметра, представляющие год, месяц и день,
являются обязательными. Остальные необязательные, и если
мы не укажем для них значения, то по умолчанию они
инициализируются нулем.
from datetimeimport datetime
dt = datetime(2022, 9, 10)
print(dt)
dt1 = datetime(2022, 9, 10, 4, 30)
print(dt1)
В этойпрограмме последовательно создается два объекта класса
datetime. Консольный вывод программы:
2022-09-10 00:00:00
2022-09-10 04:30:00

8.

Как и в случае с объектами класса time, в объектах класса datetime часть атрибутов
инициализирована нулем.
Для получения текущих даты и времени можно вызвать метод now():
from datetimeimport datetime
dt = datetime.now()
print(dt)
print(f"{dt.day}.{dt.month}.{dt.year} {dt.hour}:{dt.minute}:{dt.second}")
print(dt.date())
print(dt.time())
print(dt.weekday())
Во второй строке создается объектdt классаdatetimeпри помощи метода now(). С
помощью свойств day, month, year, hour, minute, second,microsecond можно
получить отдельные значения даты и времени. А через методы date() и time()
можно получить отдельно дату и время соответственно. Метод
weekday()возвращает день недели (пн – 0, пн – 1, ... , вс – 6) Консольный вывод
программы:
2022-08-25 16:05:11.894301
25.8.2022 16:5
2022-08-25
16:05:11.894301
3

9.

Преобразование из строки в дату
Из функциональности класса datetime следует отметить метод strptime(),
который позволяет распарсить строку (извлечь из строки нужную информацию) и
преобразовать ее в дату. Этот метод принимает два параметра:
strptime(str, format)
Первый параметр str представляет строковое определение даты и времени, а
второй параметр – формат, который определяет, как различные части даты и
времени расположены в этой строке.
Для определения формата можно использовать следующие коды:
%d: день месяца в виде числа, дополненный нулем
%m: порядковый номер месяца, дополненный нулем
%y: год в виде 2-х чисел
%Y: год в виде 4-х чисел
%H: час в 24-х часовом формате, дополненный нулем
%M: минута, дополненная нулем
%S: секунда, дополненная нулем

10.

Применим различные форматы:
from datetime import datetime
dt = datetime.strptime("10/09/2022", "%d/%m/%Y")
print(dt)
dt1 = datetime.strptime("10/09/2022 12:30", "%d/%m/%Y %H:%M")
print(dt1)
dt2 = datetime.strptime("09-10-2017 12:30", "%m-%d-%Y %H:%M")
print(dt2)
Консольный вывод программы:
2022-09-10 00:00:00
2022-09-10 12:30:00
2017-09-10 12:30:00
Во второй строке программы дата задана в формате день/месяц/год,
время не указано. Если посмотреть на выведенную на консоль строку, то
дата распознана верно, а время инициализировано нулями. В четвертой
строке к дате добавлены часы и минуты. А в шестой строке изменен
формат введенной даты: месяц-день-год часы:минуты.

11.

Форматирование дат и времени
Для форматирования объектов классов date и time в обоих этих классах предусмотрен метод strftime():
strftime(format)
Этот метод принимает только один параметр, указывающий на формат, в который нужно преобразовать дату
или время.
Для определения формата можно использовать один из следующих кодов форматирования:
%a: аббревиатура дня недели. Например, Wed (сокращение от Wednesday)
%A: день недели полностью, например, Wednesday
%b: аббревиатура названия месяца. Например, Oct (сокращение от October)
%B: название месяца полностью, например, October
%d: день месяца, дополненный нулем
%m: номер месяца, дополненный нулем
%y: год в виде 2-х чисел
%Y: год в виде 4-х чисел
%H: час в 24-х часовом формате, дополненный нулем
%I: час в 12-ти часовом формате, дополненный нулем
%M: минута, дополненная нулем
%S: секунда, дополненная нулем
%f: микросекунда
%p: указатель AM/PM
%c: дата и время, отформатированные под текущую локаль (локаль – набор параметров, определяющий
региональные настройки пользовательского интерфейса)
%x: дата, отформатированная под текущую локаль
%X: время, форматированное под текущую локаль

12.

Используем различные форматы:
from datetime import datetime
dt = datetime.now()
print(dt.strftime("%Y-%m-%d"))
print(dt.strftime("%d/%m/%Y"))
print(dt.strftime("%d/%m/%y"))
print(dt.strftime("%d %B %Y (%A)"))
print(dt.strftime("%d/%m/%y %I:%M"))
Консольный вывод программы:
2022-08-25
25/08/2022
25/08/22
25 August 2022 (Thursday)
25/08/22 04:43
При выводе названий месяцев и дней недели по умолчанию используются английские наименования. Если
требуется использовать текущую локаль, то необходимо ее предварительно установить с помощью модуля
locale:
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, "")
dt = datetime.now()
print(dt.strftime("%d %B %Y (%A)"))
Консольный вывод программы:
25 Август 2022 (четверг)

13.

Сложение и вычитание дат и
времени
Нередко при работе с датами возникает необходимость добавить к какой-либо дате определенный промежуток
времени или, наоборот, вычесть некоторый период. И специально для таких операций в модуле datetime
определен класс timedelta. Фактически этот класс определяет некоторый период времени.
Для определения промежутка времени можно использовать конструктор timedelta:
timedelta([days] [, seconds] [, microseconds] [, milliseconds] [, minutes] [, hours] [, weeks])
В конструктор последовательно передаются дни, секунды, микросекунды, миллисекунды, минуты, часы и
недели.
Определим несколько периодов (промежутков времени):
from datetime import timedelta
period1 = timedelta(hours=3)
print(period ]1)
period2 = timedelta(hours=3, minutes=30)
print(period2)
period3 = timedelta(2)
print(period3)
period4 = timedelta(days=2, hours=3, minutes=30)
print(period4)
Первый период – 3 часа, второй – 3 часа 30 минут, третий – 2 дня, четвертый – 2 дня, 3 часа, 30 минут.
Консольный вывод программы:
3:00:00
3:30:00
2 days, 0:00:00
2 days, 3:30:00

14.

Используя timedelta, мы можем складывать или вычитать даты. Например, получим дату, которая
будет через два дня:
from datetime import timedelta, datetime
dt = datetime.now()
print(dt)
period = timedelta(2)
dt1 = dt + period
print(dt1)
В четвертой строке программы создается объект класса timedelta, содержащий временной
период в 2 дня. В пятой строке текущие дата и время складываются с созданным промежутком
времени. Результатом является новый объект класса datetime. Консольный вывод программы:
2022-08-25 17:04:44.211808
2022-08-27 17:04:44.211808
Узнаем, сколько было времени 10 часов 15 минут назад, то есть фактически вычтем из текущего
времени 10 часов и 15 минут:
from datetime import timedelta, datetime
dt = datetime.now()
print(dt)
period = timedelta(hours=10, minutes=15)
dt1 = dt - period
print(dt1)
В четвертой строке программы создается объект класса timedelta, содержащий временной
период в 10 часов 15 минут. В пятой строке из текущих даты и времени вычитается созданный
промежуток времени. Результатом является новый объект класса datetime. Консольный вывод
программы:
2022-08-25 17:08:51.988204
2022-08-25 06:53:51.988204

15.

Свойства timedelta
Класс timedelta имеет несколько свойств, с помощью которых мы можем получить временной промежуток:
days: возвращает количество дней
seconds: возвращает количество секунд
microseconds: возвращает количество микросекунд
Кроме того, метод total_seconds() возвращает общее количество секунд, куда входят и дни, и собственно
секунды, и микросекунды.
Например, узнаем какой временной период между двумя датами:
from datetime import timedelta, datetime
dt = datetime.now()
dt1 = datetime(2022, 12, 10)
period = dt1 - dt
print(f"{period.days} дней {period.seconds} секунд {period.microseconds}
микросекунд")
print(f"Всего: {period.total_seconds()} секунд")
Во второй и третьей строках программы создаются два объекта класса datetime. В четвертой строке объект
period, равный разности первых двух объектов, является уже объектом класса timedelta. У объекта period можно
вызвать свойства days, seconds, microseconds и метод total_seconds().
Консольный вывод программы:
106 дней 23554 секунд 58099 микросекунд
Всего: 9181954.058099 секунд
В следующем высказывании под датой понимается дата и время (объект класса datetime): если мы складываем
(или вычитаем) две даты, то результатом будет промежуток времени; если к дате прибавить (или вычесть)
промежуток времени, то результатом будет дата.

16.

Сравнение дат
Также как и строки и числа, даты можно сравнивать с помощью
стандартных операторов сравнения:
from datetime import datetime
dt = datetime.now()
dt1 = datetime(2022, 12, 22)
if dt.date() > dt1.date():
print("Срок сдачи проекта прошел")
elif dt.date() == dt1.date():
print("Срок сдачи проекта сегодня")
else:
period = dt1 - dt
print(f"Осталось {period.days} дней")
В данной программе dt – текущие дата и время, dt1 – дата и время сдачи
проекта. Если текущая дата больше даты сдачи проекта, то программа
выведет на консоль фразу «Срок сдачи проекта прошел». Если текущая
дата равна дате проекта, программа выведет фразу «Срок сдачи проекта
сегодня». Иначе программа выведет количество оставшихся дней.

17.

Как раньше хранились данные о
времени
В повседневной жизни мы не записываем
первые два символа года — они почти всегда
одинаковые. Схожая логика продиктовала
правило экономии места на накопителях
ранних компьютеров: если век неважен, его
можно отбросить. Вместо восьми цифр
DDMMYYYY дата записывалась в шесть
DDMMYY. Например, 1 января 1957 года в
таких программах представлялось как
«010157».

18.

История ошибки 2000 года
Двузначное представление года позволяло сэкономить и так небольшую память компьютеров, которые читали код с перфокарт. Программы
должны были быть компактными и эффективными, и на тот момент было достаточно, что цифра 57 обозначает 1957 год — другие века
компьютеры не понимали.
Со временем мощность вычислительных систем росла, появились жесткие диски и дискеты для хранения данных, но большие объёмы памяти
оставались слишком дорогими. Поэтому в ход шла оптимизация: код в вычислительных системах не переписывали — ведь до 2000 года было ещё
далеко, объём баз данных продолжал расти, а новые приложения должны были быть совместимы со старыми.
Таким образом, ограничение в два символа на запись года сохранялось десятилетиями и распространилось практически на всё, что имело внутри
микропроцессор, включая самолёты, заводы, спутники и электростанции.
Проблема 2000 года заключалась в следующем. При наступлении 1 января 2000 года при двузначном представлении года после 99 наступал 00
год, что интерпретировалось многими старыми программами как 1900 год. Без указания века компьютер не отличал 2000 год от 1900.
Сложность была ещё и в том, что многие программы обращались к вычислению дат вперёд (например, составление плана закупок или любое
другое планирование вперёд). Так что для многих программ планирования и прогнозирования «Проблема 2000 года» наступала раньше, чем 1
января 2000 года.
Приведем несколько примеров проблем, возникающих при двузначном представлении года.
1. Человек родился 1 января XX20 года, а умер 2 января XX20. Прожил ли он полноценную жизнь или внезапно умер после родов? Без контекста
это установить невозможно, поэтому мы переспросим, ушёл ли из жизни необычный долгожитель или младенец.
2. Срок действия на банковской карте указывается в виде MM/YY, например 05/98 или 12/95. Некоторые простейшие алгоритмы платёжных
систем проверяли просроченность арифметическим сравнением чисел YYMM: 9805 и 9512. Контрпример для такого алгоритма — любая карта,
действительная позднее 2000 года. В 1999 году наивный алгоритм назовёт недействительной карту со сроком действия 12/01, так как 99** > 0112.
3. По дате формата YYMMDD удобно сортировать: сравнение, что случилось раньше, сводится к арифметической операции. Действительно, чтобы
сравнить
даты
1 января 1998 года и 15 августа 1995 года достаточно сравнить числа 980101 и 950815. С наступлением нового века сортировка сломается: год 00
должен быть позднее 99, а не наоборот. Число 000101 окажется меньше, чем 991231, то есть 1 января 2000 года программа скажет, что 31
декабря 1999 ещё не наступило. Попытка вычислить срок между этими датами вернёт почти 100 лет, а не 1 сутки.
4. Если 2000 год високосный (он делится на 400), то 1900 — нет. В реальном 2000 году есть 29 февраля. Если компьютер посчитает, что на дворе
1900, после 28 февраля наступит сразу 1 марта.
Впервые о проблеме 2000 года заявил программист IBM Питер де Ягер еще в 1978 году. Ягер поделился беспокойством с боссом, но в ответ
получил лишь насмешку.
И лишь во второй половине девяностых годов проблемой стали вплотную заниматься на корпоративном и межгосударственном уровне.
1 января 2000 года по всему миру не было замечено серьёзных сбоев: самолёты летали, электричество подавалось в дома, банки проводили
финансовые операции, а ракетные державы не устроили третью мировую войну.

19.

Современные способы хранения
времени
1. Один из самых распространенных способов кодирования времени – это Unix-время. Оно определяется как количество секунд, прошедших с
полуночи 1 января 1970 года. Таким образом, Unix-время представлено целым числом, которое увеличивается с каждой прошедшей секундой. В
момент времени 00:00:00 1 января 1970 года Unix-время равно нулю – это начало Unix-эпохи. Более ранние даты выражаются отрицательными
числами.
Этот способ хранения данных о времени распространился благодаря операционной системе Unix. Ее разработка велась с начала 1970-х, и за
отправную точку была принята ближайшая круглая дата.
Целочисленную систему удобно использовать для сравнения и хранения дат. В случае необходимости секунды переводятся в часы, дни, месяцы и
годы, предоставляя пользователю удобный вид отображения времени.
Чтобы увидеть количество секунд, прошедших с момента начала эпохи, достаточно вызвать метод time() из модуля time.
from
time
import
time
print(time())
Консольный вывод программы:
1661488803.4127288
Метод timestamp() класса datetime возвращает время в секундах с начала эпохи для заданного момента времени. Если получить текущие дату и
время при помощи метода now(), то количество секунд, прошедших с момента начала эпохи, можно вычислить следующим образом:
from
datetime
import
datetime
dt
=
datetime.now()
print(dt.timestamp())
Консольный вывод программы:
1661517782.823782
Обратную операцию – получение даты по числу секунд, прошедших с начала эпохи, можно осуществить при помощи метода fromtimestamp()
класса datetime():
from
datetime
import
datetime
second
=
1661588272
dt
=
datetime.fromtimestamp(second)
print("Дата и время:", dt)
Консольный вывод программы:
Дата и время: 2022-08-27 14:17:52

20.

2. Используется также хранение даты и времени в виде
действительного числа (числа с плавающей точкой). Целая часть
числа представляет собой дату, дробная часть – время.
Нулевому значению даты соответствует 30 декабря 1899 г. Дата –
это порядковый номер дня, начиная от 30 декабря 1899 г. Даты до
30 декабря 1899 г. хранятся в виде отрицательных чисел.
Время может принимать значения от 0.0 (00:00:00) до 0.99999
(23:59:59). Числовое значение представляет собой долю дня.
Например, 12:00 представляется как 0.5, поскольку это полдня.
Можно перевести числовое значение в часы, умножив его на 24.

21.

Материал лекции составлен на основе следующих
информационных ресурсов:
Руководство по языку программирования Python.
https://metanit.com/python/tutorial/2.1.php
Шелудько В.М. Язык программирования высокого уровня
Python : функции, структуры данных, дополнительные
модули: учебное пособие. Ростов-на-Дону, Таганрог:
Южный федеральный университет, 2017. 108 с.
История
ошибки
2000
года.
https://habr.com/ru/company/alfa/blog/517096/
https://vc.ru/story/295759-konca-sveta-ne-bylo-zato-bylishalnye-dengi-rost-it-i-poyavilsya-indiyskiy-autsors-istoriyaproblemy-2000

22.

Практические занятия № 1 - 6

23.

Задание 1. Получите текущую дату и время.
Выведите на экран отдельно на каждой строке
год, месяц, день, часы, минуты, секунды
• Решение:
• from datetime import datetime
dt = datetime.now()
print("Год:", dt.year)
print("Месяц:", dt.month)
print("День:", dt.day)
print("Часы:", dt.hour)
print("Минуты:", dt.minute)
print("Секунды:", dt.second)

24.

Задание 2. Получите текущую дату и время.
На одной строке выведите дату, на другой –
время.
Воспользуйтесь методами date() и time().
Решение:
from datetime import datetime
dt = datetime.now()
print("Дата:", dt.date())
print("Время:", dt.time())

25.

Задание 3. Вычислите, сколько секунд
прошло с начала эпохи до текущего момента
времени.
Решение:
from datetime import datetime
dt = datetime.now()
print("С начала эпохи прошло секунд:",
dt.timestamp())

26.

Задание 4. Вычислите дату, соответствующую
1661588678 секундам, прошедшим с начала
эпохи.
Решение:
from datetime import datetime
second = 1661588678
dt = datetime.fromtimestamp(second)
print("Дата и время:", dt)
Консольный вывод программы:
Дата и время: 2022-08-27 14:24:38

27.

Задание 5. Преобразуйте в дату и время следующие строки:
«15.10.2022» (дата),
«15-10-22 14:20» (дата и время),
«22/10/15 14-20-35» (дата и время),
«14:20:35 2022-10-15» (время и дата)
Для решения воспользуйтесь методом strptime(). Для определения формата можно использовать
коды:
%d: день месяца в виде числа, дополненный нулем
%m: порядковый номер месяца, дополненный нулем
%y: год в виде 2-х чисел
%Y: год в виде 4-х чисел
%H: час в 24-х часовом формате, дополненный нулем
%M: минута, дополненная нулем
%S: секунда, дополненная нулем
Решение:
from datetime import datetime
dt = datetime.strptime("15.10.2022", "%d.%m.%Y")
print(dt)
dt1 = datetime.strptime("15-10-22 14:20", "%d-%m-%y %H:%M")
print(dt1)
dt2 = datetime.strptime("22/10/15 14-20-05", "%y/%m/%d %H-%M-%S")
print(dt2)
dt3 = datetime.strptime("14:20:05 2022-10-15", "%H:%M:%S %Y-%m-%d")
print(dt3)

28.

Задание 6. Выведите текущие дату и время в форматах, представленных следующими примерами:
«14:20 – 15.10.2022 год»
«Часов: 14, минут: 20, секунд: 05, 15.10.22 год»
«15 Октябрь 2022 г. (суббота)»
«14:20:05, Сб, 15 окт 2022 г.»
Для решения воспользуйтесь методом strftime(). Для определения формата можно использовать коды:
%a: аббревиатура дня недели. Например, Wed (сокращение от Wednesday)
%A: день недели полностью, например, Wednesday
%b: аббревиатура названия месяца. Например, Oct (сокращение от October)
%B: название месяца полностью, например, October
%d: день месяца, дополненный нулем
%m: номер месяца, дополненный нулем
%y: год в виде 2-х чисел
%Y: год в виде 4-х чисел
%H: час в 24-х часовом формате, дополненный нулем
%M: минута, дополненная нулем
%S: секунда, дополненная нулем
Для установки русских названий месяцев и дней недели вставьте в программу следующие строчки кода:
import locale
locale.setlocale(locale.LC_ALL, "")
Решение:
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, "")
dt = datetime.now()
print(dt.strftime("%H:%M - %d.%m.%Y год"))
print(dt.strftime("Часов: %H, минут: %M, секунд: %S, %d.%m.%y год"))
print(dt.strftime("%d %B %Y г. (%A)"))
print(dt.strftime("%H:%M:%S, %a, %d %b %Y г."))

29.

Задание 7. Напишите программу, которая выводит количество дней,
оставшихся до нового года.
Решение:
from datetime import datetime
dt = datetime.now()
new_year = datetime(2023, 1, 1)
period = new_year - dt
print("До Нового года осталось полных дней:", period.days)
Необходимо обратить внимание, что свойство days выдает количество
полных дней, то есть уже начавшийся текущий день не считается. Чтобы
исправить это, необходимо при вычислении значения переменной period
вычитать текущую дату с нулевым значением времени. Этого можно
добиться следующим образом:
period = new_year.date() - dt.date()
print("До Нового года осталось дней:", period.days)

30.

Задание 8. Напишите программу, которая
подсчитывает, сколько дней прошло с 1 марта
2022 года.
Решение:
from datetime import datetime
dt = datetime.now()
dt1 = datetime(2022, 3, 1)
period = dt - dt1
print("C 1 марта 2022 года прошло дней:",
period.days)

31.

Задание 9. Напишите программу, выводящую
дату, которая будет через 3 недели и 5 дней.
Дата должна выводиться в формате
«DD.MM.YYYY».
Решение:
from datetime import datetime, timedelta
dt = datetime.now()
period = timedelta(weeks=3, days=5)
dt1 = dt + period
print("Дата через 3 недели и 5 дней:",
dt1.strftime("%d.%m.%Y"))

32.

Задание 10. Напишите программу,
выводящую дату, которая была 100 дней
назад. Дата должна выводиться в формате
«DD/MM/YYYY».
Решение:
from datetime import datetime, timedelta
dt = datetime.now()
period = timedelta(days=100)
dt1 = dt - period
print("Дата 100 дней назад:",
dt1.strftime("%d/%m/%Y"))

33.

Задание 11. Напишите программу, выводящую
время, которое будет через 1 час
30 минут и 45 секунд. Время должно выводиться
в формате «HH:MM:SS»
Решение:
from datetime import datetime, timedelta
dt = datetime.now()
period = timedelta(hours=1, minutes=30,
seconds=45)
dt1 = dt + period
print("Время через 1 час 30 минут и 45 секунд:",
dt1.strftime("%H:%M:%S"))

34.

Задание 12. Напишите программу, которая запрашивает у пользователя
дату (число, месяц, год отдельно) и выводит количество дней, оставшихся
до этой даты или прошедших с этой даты. Если дата совпадает с текущей,
программа выводит фразу «Вы ввели текущую дату».
Решение:
from datetime import datetime
d = int(input("Введите число: "))
m = int(input("Введите месяц: "))
y = int(input("Введите год: "))
dt = datetime.now()
dt1 = datetime(y, m, d)
if dt.date() > dt1.date():
period = dt - dt1
print("Прошло дней: ", period.days)
elif dt.date() < dt1.date():
period = dt1.date() - dt.date()
print("Осталось дней: ", period.days)
else:
print("Вы ввели текущую дату")

35.

Задание 13. Дополните код из предыдущего задания проверкой правильности введенной даты.
Напомним, что год является високосным, если его номер кратен 4, но не кратен 100, а также если он кратен 400. Для
досрочного выхода из программы можно использовать функцию exit().
Решение:
from datetime import datetime, timedelta
d = int(input("Введите число: "))
m = int(input("Введите месяц: "))
y = int(input("Введите год: "))
if y > 9999:
print("Слишком большой год")
exit()
elif y <= 0:
print("Слишком маленький год")
exit()
elif (m < 1) or (m > 12):
print("Неверный месяц")
exit()
elif ((m in (1, 3, 5, 7, 8, 10, 12)) and ((d < 1) or (d > 31))) or\
((m in (4, 6, 9, 11)) and ((d < 1) or (d > 30))):
print("Неверный день")
exit()
elif (m == 2):
key_vis = ((y % 4 == 0) and (y % 100 != 0)) or (y % 400 == 0)
if ((key_vis == True) and ((d < 1) or (d > 29))) or\
((key_vis == False) and ((d < 1) or (d > 28))):
print("Неверный день")
exit()
# Далее следует код из предыдущего задания
dt = datetime.now()
dt1 = datetime(y, m, d)
if dt.date() > dt1.date():
period = dt - dt1
print("Прошло дней: ", period.days)
elif dt.date() < dt1.date():
period = dt1.date() - dt.date()
print("Осталось дней: ", period.days)
else:
print("Вы ввели текущую дату")

36.

Задание 14. По заданному числу n от 1 до 365
определите, на какое число какого месяца
приходится день невисокосного года с номером
n.
Решение:
from datetime import datetime, timedelta
import locale
locale.setlocale(locale.LC_ALL, "")
n = int(input("Введите число от 1 до 365: "))
period = timedelta(days = n - 1)
dt = datetime(2022, 1, 1) + period
print(dt.strftime("%d %B"))

37.

Задание 15. Решите обратную предыдущей задачу: по записи названия
месяца и дня определите номер дня в году.
Для преобразования строки-названия месяца в число следует
использовать словарь:
MonthNums = {"Январь": 1, "Февраль": 2, "Март": 3, ...}
Решение:
from datetime import datetime
MonthNums = {"Январь": 1, "Февраль": 2, "Март": 3, "Апрель": 4,
"Май": 5, "Июнь": 6,\
"Июль": 7, "Август": 8, "Сентябрь": 9, "Октябрь": 10, "Ноябрь": 11,\
"Декабрь": 12}
m_str = input("Введите название месяца: ")
m = MonthNums[m_str]
d = int(input("Введите число: "))
dt = datetime(2022, 1, 1)
dt1 = datetime(2022, m, d)
period = dt1 - dt
print(period.days + 1)

38.

Задание 16. Решите предыдущую задачу, не используя
словарь. Воспользуйтесь методом strptime().
Решение:
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, "")
m_str = input("Введите название месяца: ")
d_str = input("Введите число: ")
date_str = d_str + m_str + "2022"
dt = datetime(2022, 1, 1)
dt1 = datetime.strptime(date_str, "%d%B%Y")
period = dt1 - dt
print(period.days + 1)

39.

Задание 17. Дата задана в формате dd.mm.yyyy. Выведите
название дня недели, на который приходится эта дата.
Для вывода названия дней недели следует использовать
список:
DayOfTheWeek = ("Понедельник", "Вторник", "Среда", …)
Решение:
from datetime import datetime
DayOfTheWeek = ("Понедельник", "Вторник", "Среда",
"Четверг", "Пятница", "Суббота",\
"Воскресенье")
date_str = input("Введите дату в формате \"dd.mm.yyyy\":
")
dt = datetime.strptime(date_str, "%d.%m.%Y")
w = dt.weekday()
print(DayOfTheWeek[w])

40.

Задание 18. Задан день и месяц рождения в формате
dd.mm. Определите, сколько дней осталось до дня
рождения. Если день рождения сегодня, то необходимо
вывести 0.
Решение:
from datetime import datetime
date_str = input("Введите число и месяц рождения в
формате \"dd.mm\": ")
dt = datetime.now()
date_str1 = date_str + "." + str(dt.year)
dt1 = datetime.strptime(date_str1, "%d.%m.%Y")
if dt1.date() < dt.date(): # Если в этом году день рождения
уже прошел
date_str1 = date_str + "." + str(dt.year + 1)
dt1 = datetime.strptime(date_str1, "%d.%m.%Y")
period = dt1.date() - dt.date()
print("До дня рождения осталось дней:", period.days)

41.

Задание 19. Определите количество секунд,
которое прошло с начала суток.
Решение:
from datetime import datetime
dt = datetime.now()
s = dt.hour * 3600 + dt.minute * 60 + dt.second
print("С начала суток прошло секунд:", s)

42.

Задание 20. Часы показывают время в формате hh:mm:ss. На
этих часах запустили таймер, который прозвенит через n
секунд. Определите время, которое будет на часах, когда
прозвенит таймер.
Решение:
from datetime import datetime, timedelta
time_str = input("Введите время в формате \"hh:mm:ss\": ")
n = int(input("Введите количество секунд: "))
dt = datetime.strptime(time_str, "%H:%M:%S")
period = timedelta(seconds = n)
dt1 = dt + period
print("Время срабатывания таймера:",
dt1.strftime("%H:%M:%S"))

43.

Задание 21. Измените программу так, чтобы время, через которое
сработает таймер, можно было ввести в формате hh:mm:ss.
Решение:
from datetime import datetime, timedelta
time_str = input("Введите время в формате \"hh:mm:ss\": ")
timer_str = input("Введите время, через которое сработает
таймер, в формате
\"hh:mm:ss\": ")
dt = datetime.strptime(time_str, "%H:%M:%S")
list = timer_str.split(":")
period = timedelta(hours=int(list[0]), minutes=int(list[1]),
seconds=int(list[2]))
dt1 = dt + period
print("Время срабатывания таймера:", dt1.strftime("%H:%M:%S"))
Метод split() разбивает строку на части, используя специальный
разделитель, и возвращает эти части в виде списка. В нашем
случае разделителем является двоеточие «:».

44.

Задание 22. Профессор лег спать, когда на часах было время h1:m1:s1, а когда он
проснулся было время h2:m2:s2. Определите, сколько времени спал профессор,
если известно, что он проспал не более суток. Время выведите в формате
hh:mm:ss.
Решение:
from datetime import datetime, timedelta, time
time_str1 = input("Введите время, когда профессор уснул, в формате
\"hh:mm:ss\": ")
time_str2 = input("Введите время, когда профессор проснулся, в формате
\"hh:mm:ss\":
")
dt1 = datetime.strptime(time_str1, "%H:%M:%S")
dt2 = datetime.strptime(time_str2, "%H:%M:%S")
if dt2 < dt1:
dt2 = dt2 + timedelta(days = 1)
period = dt2 - dt1
h = int(period.total_seconds()) // 3600
m = (int(period.total_seconds()) % 3600) // 60
s = (int(period.total_seconds()) % 3600) % 60
t = time(h, m, s)
print("Профессор спал", t.strftime("%H:%M:%S"))
Метод strftime() есть и в классе time, мы воспользовались им для вывода
времени в заданном формате.

45.

Задание 23. Пронумеруем все даты подряд, считая, что 01.01.0001 имеет номер 1, 02.01.0001 номер 2 и т.д. По заданной дате определите ее порядковый номер.
Решение:
from datetime import datetime
d = int(input("Введите число: "))
m = int(input("Введите месяц: "))
y = int(input("Введите год: "))
dt = datetime(y, m, d)
dt1 = datetime(1, 1, 1)
dd = 0
for i in range(2, dt.year + 1):
dt2 = datetime(i, 1, 1)
period = dt2 - dt1
dd = dd + period.days
dt1 = dt2
period = dt - dt1
dd = dd + period.days + 1
print("Порядковый номер: ", dd)
Консольный вывод программы:
Введите число: 27
Введите месяц: 8
Введите год: 2022
Порядковый номер: 738394

46.

Задание 24. Решите обратную задачу: определите дату по номеру дня.
Решение:
from datetime import datetime, timedelta
dd = int(input("Введите порядковый номер дня: "))
dt1 = datetime(1, 1, 1)
dt2 = datetime(2, 1, 1)
period = dt2 - dt1
i=2
while (dd - period.days) > 0:
dd = dd - period.days
i += 1
dt1 = dt2
dt2 = datetime(i, 1, 1)
period = dt2 - dt1
dt = dt1 + timedelta(days = dd - 1)
print(dt.strftime("%d.%m.%Y"))
Консольный вывод программы:
Введите порядковый номер дня: 738394
27.08.2022

47.

Задание 25. Имеется список людей с указанием их фамилии, имени и даты рождения. Напишите
программу, которая будет определять самого старшего человека из этого списка и выводить его
фамилию, имя и дату рождения. Если имеется несколько самых старших людей с одинаковой датой
рождения, то программа должна выбирать первого в списке.
На вход программе в первой строке подается количество людей в списке N. В каждой из
последующих N строк вводится информация в следующем формате:
<Фамилия> <Имя> <Дата рождения>
Дата рождения вводится в формате DD.MM.YYYY.
Решение:
from datetime import datetime
N = int(input("Введите количество людей: "))
dt_min = datetime(9999,12,31)
last_name_min = ""
first_name_min = ""
for i in range(0, N):
last_name = input(f"Введите фамилию {i+1}-го человека: ")
first_name = input(f"Введите имя {i+1}-го человека: ")
date_str = input(f"Введите дату рождения {i+1}-го человека в формате
\”dd.mm.yyyy\”: “)
dt = datetime.strptime(date_str, “%d:%m:%Y”)
if dt < dt_min:
dt_min = dt
l
ast_name_min = last_name
first_name_min = first_name
print(last_name_min, first_name_min, dt_min.strftime(“%d:%m:%Y”))

48.

Самостоятельная работа. Занятия № 1-2

49.

Задание 1. Дата задана в формате «dd.mm.yyyy».
Выведите ее в формате
«Месяц dd, yy», где Месяц – русское название месяца,
dd – номер дня в месяце, yy – номер года.
Решение:
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, “”)
date_str = input(“Введите дату в формате
\”dd.mm.yyyy\”: “)
dt = datetime.strptime(date_str, “%d.%m.%Y”)
print(dt.strftime(“%B %d, %y”))

50.

Задание 2. Решите обратную задачу.
Решение:
from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, “”)
date_str = input(“Введите дату в формате
\”Месяц dd, yy\”: “)
dt = datetime.strptime(date_str, “%B %d, %y”)
print(dt.strftime(“%d.%m.%Y”))

51.

Задание 3. Дата задана в формате
«dd.mm.yyyy». Выведите дату, следующую за
ней в том же формате.
Решение:
from datetime import datetime, timedelta
date_str = input(“Введите дату в формате
\”dd.mm.yyyy\”: “)
dt = datetime.strptime(date_str, “%d.%m.%Y”)
dt1 = dt + timedelta(days=1)
print(dt1.strftime(“%d.%m.%Y”))

52.

Задание 4. Дата задана в формате
«dd.mm.yyyy». Выведите дату,
предшествующую ей в том же формате.
Решение:
from datetime import datetime, timedelta
date_str = input(“Введите дату в формате
\”dd.mm.yyyy\”: “)
dt = datetime.strptime(date_str, “%d.%m.%Y”)
dt1 = dt – timedelta(days=1)
print(dt1.strftime(“%d.%m.%Y”))

53.

Задание 5. Две даты заданы в формате
«dd.mm.yyyy», каждая дата – в новой строке.
Определите количество дней между этими
датами. Вторая дата больше первой.
Решение:
from datetime import datetime
date_str = input(«Введите первую дату в
формате \»dd.mm.yyyy\»: «)
dt = datetime.strptime(date_str, «%d.%m.%Y»)
date_str = input(«Введите вторуюве дату в
формате \»dd.mm.yyyy\»: «)
dt1 = datetime.strptime(date_str, «%d.%m.%Y»)
period = dt1 – dt
print(«Дней между датами:», period.days)

54.

Задание 6. Напишите программу, которая
подсчитывает, сколько часов прошло между
00:00:00 часами 1 марта 2022 года и текущим
моментом.
Решение:
from datetime import datetime
dt = datetime.now()
dt1 = datetime(2022, 3, 1)
period = dt – dt1
hours = int(period.total_seconds() // 3600)
print(“C 1 марта 2022 года прошло часов:”,
hours)

55.

Задание 7. Выведите на экран количество
секунд, которое осталось до конца суток.
Решение:
from datetime import datetime, timedelta
dt = datetime.now()
dt1 = dt + timedelta(days=1)
dt1 = datetime(dt1.year, dt1.month, dt1.day)
period = dt1 – dt
print(“До конца суток осталось секунд:”,
int(period.total_seconds()))

56.

Задание 8. Напишите программу, которая запрашивает у
пользователя время (часы, минуты, секунды отдельно) и выводит
количество секунд, оставшихся до этого времени или прошедших
после этого времени.
Решение:
from datetime import datetime
h = int(input(«Введите часы: «))
m = int(input(«Введите минуты: «))
s = int(input(«Введите секунды: «))
dt = datetime.now()
dt1 = datetime(dt.year, dt.month, dt.day, h, m, s)
if dt > dt1:
period = dt – dt1
print(«Прошло полных секунд: «, int(period.total_seconds())
else:
period = dt1 – dt
print(«Осталось полных секунд: «, int(period.total_seconds())

57.

Задание 9. Измените предыдущую программу так, чтобы она выводила
найденный промежуток времени в часах, минутах и секундах.
Решение:
from datetime import datetime
h = int(input(“Введите часы: “))
m = int(input(“Введите минуты: “))
s = int(input(“Введите секунды: “))
dt = datetime.now()
dt1 = datetime(dt.year, dt.month, dt.day, h, m, s)
if dt > dt1:
period = dt – dt1
else:
period = dt1 – dt
h = int(period.total_seconds()) // 3600
m = (int(period.total_seconds()) % 3600) // 60
s = (int(period.total_seconds()) % 3600) % 60
if dt > dt1:
print(f”Прошло полных часов: {h}, минут: {m}, секунд: {s}”)
else:
print(f”Осталось полных часов: {h}, минут: {m}, секунд: {s}”)

58.

Задание 11. Имеется список людей с указанием их фамилии, имени и даты рождения. Напишите
программу, которая будет определять самого младшего человека из этого списка и выводить его
фамилию, имя и дату рождения. Если имеется несколько самых младших людей с одинаковой
датой рождения, то программа должна выбирать первого в списке.
На вход программе в первой строке подается количество людей в списке N. В каждой из
последующих N строк вводится информация в следующем формате:
<Фамилия> <Имя> <Дата рождения>
Дата рождения вводится в формате DD.MM.YYYY.
Решение:
from datetime import datetime
N = int(input("Введите количество людей: "))
dt_max = datetime(1,1,1)
last_name_max = ""
first_name_max = ""
for i in range(0, N):
last_name = input(f"Введите фамилию {i+1}-го человека: ")
first_name = input(f"Введите имя {i+1}-го человека: ")
date_str = input(f"Введите дату рождения {i+1}-го человека в формате
\"dd.mm.yyyy\": ")
dt = datetime.strptime(date_str, "%d:%m:%Y")
if dt > dt_max:
dt_max = dt
last_name_max = last_name
first_name_max = first_name
print(last_name_max, first_name_max, dt_max.strftime("%d:%m:%Y"))
English     Русский Правила