Добавить в корзинуПозвонить
Найти в Дзене
Машинное обучение

⏱ Продвинутая работа со временем. Python

⏳ timedelta В модуле datatime содержатся классы для работы с датой и временем. В частности часто используются datetime для хранения даты и времени некоторого события и timedelta для хранения интервала времени между каким-то двумя событиями. Удобно работать с datetime и timedelta путем математических операций.  📎 Примеры. Добавить к дате один день, год или отнять 2:20 (функция str тут для человекочитаемого формата): >>> str(datetime.now() + timedelta(days=1)) '2019-10-06 15:51:09.089691' >>> str(datetime.now() + timedelta(days=365)) '2020-10-04 15:52:04.618896' >>> str(datetime.now() - timedelta(hours=2, minutes=20)) '2019-10-05 13:41:27.617589' Разница во времени между событиями: >>> a = datetime.now() >>> b = datetime.now() + timedelta(minutes=5) >>> b - a datetime.timedelta(0, 317, 99915) >>> str(b - a) '0:05:17.099915' timedelta внутренне хранит только секунды от начала дня и сами дни, хотя в конструкторе принимает дни, секунды, микросекунды, миллисекунды, минуты, часы и неде

timedelta

В модуле datatime содержатся классы для работы с датой и временем. В частности часто используются datetime для хранения даты и времени некоторого события и timedelta для хранения интервала времени между каким-то двумя событиями.

Удобно работать с datetime и timedelta путем математических операций. 

📎 Примеры. Добавить к дате один день, год или отнять 2:20 (функция str тут для человекочитаемого формата):

>>> str(datetime.now() + timedelta(days=1))

'2019-10-06 15:51:09.089691'

>>> str(datetime.now() + timedelta(days=365))

'2020-10-04 15:52:04.618896'

>>> str(datetime.now() - timedelta(hours=2, minutes=20))

'2019-10-05 13:41:27.617589'

Разница во времени между событиями:

>>> a = datetime.now()

>>> b = datetime.now() + timedelta(minutes=5)

>>> b - a

datetime.timedelta(0, 317, 99915)

>>> str(b - a)

'0:05:17.099915'

timedelta внутренне хранит только секунды от начала дня и сами дни, хотя в конструкторе принимает дни, секунды, микросекунды, миллисекунды, минуты, часы и недели (можно выбрать любые их сочетания для задания интервала): 

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

>>> str(timedelta(days=1, hours=2, milliseconds=333))

'1 day, 2:00:00.333000'

Причем мы не обязаны нормализовывать аргументы: он сам поймет, что 200 минут – это 3 часа 20 минут:

>>> str(timedelta(minutes=200))

'3:20:00'

Достать часы и минуты (странно, что у объекта нет свойств hours и minutes):

def hours_minutes(td):

  return td.seconds // 3600, (td.seconds // 60) % 60

>>> hours_minutes(timedelta(0, 12345))

(3, 25)

Сколько всего секунд в интервале:

>>> timedelta(minutes=200, seconds=21, hours=25).total_seconds()

102021.0

Можно даже уможнать timedelta на числа или поделить два timedelta или взять остаток. Допустим рабочая смена длится 7 часов 30 минут, сколько полных смен в 3-х сутках?

>>> a = timedelta(days=3)

>>> b = timedelta(hours=7, minutes=30)

>>> a // b

9

>>> str(a % b)

'4:30:00'

Ответ 9 полных смен и еще останется 4 часа 30 минут лишних.

Бонус. Формат даты по-нашенскому (ДД.ММ.ГГГГ):

>>> datetime.strftime(datetime.now(), '%d.%m.%Y')

'05.10.2019'

#python