Как добавить дельту в python datetime.time?

От:

http://docs.python.org/py3k/library/datetime.html#timedelta-objects

Объект timedelta представляет продолжительность, разницу между двумя датами или временем.

Итак, почему я получаю сообщение об ошибке:

>>> from datetime import datetime, timedelta, time
>>> datetime.now() + timedelta(hours=12)
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862)
>>> datetime.now().date() + timedelta(hours=12)
datetime.date(2012, 9, 16)

>>> datetime.now().time() + timedelta(hours=12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'

person xliiv    schedule 16.09.2012    source источник


Ответы (5)


datetime.time объекты не поддерживают добавление с datetime.timedeltas.

Однако есть одно естественное определение — арифметика часов. Вы можете вычислить это так:

import datetime as dt
now = dt.datetime.now()
delta = dt.timedelta(hours = 12)
t = now.time()
print(t)
# 12:39:11.039864

print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time())
# 00:39:11.039864

dt.datetime.combine(...) поднимает datetime.time t до объекта datetime.datetime, затем добавляется дельта, и результат возвращается обратно к объекту datetime.time.

person unutbu    schedule 16.09.2012
comment
Это много работы. Я только хочу рассчитать сдвиг во времени, питон :). однако это решение, спасибо. - person xliiv; 16.09.2012
comment
Здесь следует отметить, что если t меньше, чем delta, то вы получите dt.date(1,1,0), то есть OverflowError: date value out of range . Один из способов приблизиться к этому — увеличить значения в dt.date(...). Но это все еще проблема, с которой нужно быть осторожным. - person Akavall; 25.08.2015
comment
это старый пост, какая тогда была версия Python? Вероятно, 2. Я использую Python 3 и имею ту же проблему. Действительно разочаровывает тот факт, что я попробовал это без всего этого обходного пути на консоли, и он отлично работает, а затем поместил его в свой код, и он полностью терпит неудачу. Это действительно очень очень грустно. В любом случае заявленный обходной путь работает. - person DanDan; 22.11.2018

Все приведенные выше решения слишком сложны, ОП уже показал, что мы можем выполнять расчет между datetime.datetime и datetime.timedelta, так почему бы просто не сделать:

(datetime.now() + timedelta(hours=12)).time()

person ssword    schedule 23.02.2019
comment
ваш путь показывает объект datetime.datetime. у него есть объект datetime.time - person jon rios; 25.05.2021
comment
Это дает другой результат: datetime.datetime(2012, 9, 17, 6, 24, 9, 635862) вместо datetime.date(2012, 9, 16, 12) - person user2561747; 24.06.2021

Вот функция, которая добавляет time к timedelta:

def time_plus(time, timedelta):
    start = datetime.datetime(
        2000, 1, 1,
        hour=time.hour, minute=time.minute, second=time.second)
    end = start + timedelta
    return end.time()

Это обеспечит ожидаемый результат, если вы не добавите время таким образом, чтобы пересечь границу полуночи.

person David Foster    schedule 04.08.2015

Как это будет работать? datetime.datetime.now().time() возвращает только часы, минуты, секунды и так далее, нет информации о дате, что возвращает .time(), только время.

Что тогда должно возвращать 18:00:00 + 8 hours?
На этот вопрос нет ответа, и поэтому вы не можете добавить время и временную дельту.

Другими словами:

18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012
18:28:44 + 8 hours # Doesn't make sense.
person Thomas Orozco    schedule 16.09.2012
comment
Хотя ваша общая точка зрения верна, 18:00 + 5 часов = 23:00, так что это плохой пример, и .time() не возвращает временную метку — временная метка часто содержит достаточно информации для получения даты, а объект datetime.time — нет. - person agf; 16.09.2012
comment
@agf, да, на самом деле я редактировал свой пост :). Я также изменю использование метки времени! - person Thomas Orozco; 16.09.2012
comment
Хорошо, я понимаю объяснение, я собираюсь привыкнуть к нему. назовите меня глупым, но в моих рассуждениях добавление часов только к дате должно вызывать исключение в любом из них :) однако в этой форме это не компактно. Я думаю, что добавление времени ко времени в течение одного дня (24 часа) может быть возможным. Как я могу добиться этого в текущем состоянии, например, добавить 2 часа 33 минуты к now()? - person xliiv; 16.09.2012
comment
Ответ @xliiv unubtu даст вам это :) - person Thomas Orozco; 16.09.2012

Объект datetime.time можно разделить на отдельные целочисленные компоненты, к которым можно добавлять. Нет необходимости в timedelta, например:

from datetime import datetime, time
    time_now = datetime.now().time()
    twelve_hours_time =  time(time_now.hour + 12, time_now.minute)
person Martin Jones    schedule 20.07.2018
comment
Это может привести к сдвигу часовой составляющей ›23 или минутной ›59, и тогда вы получите ValueError. При сложении проще всего использовать дату и время вместо времени. У меня были случаи использования, когда я просто заставлял манекен datetime.datetime(1, 1, 1, hour, minute) выполнять добавление timedelta, а затем конвертировать во время. - person Brian; 31.07.2018