Timedelta умножается на float в python

У меня есть две даты, и я могу рассчитать timedelta, как обычно.

Но я хочу рассчитать несколько процентов с полученной временной дельтой:

full_time = (100/percentage) * timdelta

Но, похоже, это можно только умножать на проценты.

Как я могу использовать float вместо int в качестве множителя?

Пример:

percentage     = 43.27
passed_time    = fromtimestamp(fileinfo.st_mtime) - fromtimestamp(fileinfo.st_ctime)
multiplier     = 100 / percentage   # 2.3110700254217702796394730760342
full_time      = multiplier * passed_time # BUG: here comes exception
estimated_time = full_time - passed_time

Если используется int(multiplier) — страдает точность.


person Крайст    schedule 05.09.2012    source источник
comment
Вы правы, timedelta просто поддерживает умножение или деление с целыми числами, но почему вы не выполняете математические операции последовательно, шаг за шагом? full_time = passed_time * 100 / int(percentage)   -  person Colin O'Coal    schedule 05.09.2012
comment
@Colin O'Coal, из-за точности: 2 != 2.3131. Сравните: 571 * 2 = 1142 (19,03(3) минуты); 571 * 2.3131 = 1320,7801 (22,0130016(6) минут). Разница составляет около 3 минут (!)   -  person Крайст    schedule 05.09.2012


Ответы (2)


Вы можете конвертировать в общее количество секунд и обратно:

full_time = timedelta(seconds=multiplier * passed_time.total_seconds())

timedelta.total_seconds доступен в Python 2.7; в более ранних версиях используйте

def timedelta_total_seconds(td):
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / float(10**6)
person ecatmur    schedule 05.09.2012
comment
просто спасибо! Честно говоря, я забыл о конструкторе timedelta. И спасибо за обратную совместимость ) - person Крайст; 05.09.2012

Вы можете использовать total_seconds():

datetime.timedelta(seconds=datetime.timedelta(minutes=42).total_seconds() * 0.8)
# => datetime.timedelta(0, 2016)
person Community    schedule 05.09.2012