2012-09-05 32 views
15

Mam dwie daty i mogę obliczyć timedelta jak zwykle.Timedelta mnożyć z pływakiem w pytonie

Ale chcę, aby obliczyć jakiś procent z wynikającą timedelta:

full_time = (100/percentage) * timdelta 

Ale wydaje się, że może to tylko pomnożenie z interegs.

Jak używać jako mnożnika float zamiast int?

przykład:

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 

Jeśli stosuje się int(multiplier) - dokładność cierpi.

+0

Masz rację, timedelta obsługuje tylko mnożenie lub dzielenie z intergers, ale dlaczego nie wykonywać operacje matematyczne w kroku sekwencji po kroku? 'full_time = czas przeszły * 100/int (procent)' –

+0

@Colin O'Coal, z powodu dokładności: '2! = 2,3131'. Porównaj: '571 * 2 = 1142' (** 19 **, 03 (3) minut); '571 * 2,3131 = 1320,7801'' (** 22 **, 0130016 (6) minut). Różnica wynosi około ** 3 minut ** (!) –

Odpowiedz

22

można przekonwertować do całkowitej sekund i znowu:

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

timedelta.total_seconds jest dostępny z Pythonem 2.7; na wcześniejsze wersje używać

def timedelta_total_seconds(td): 
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/float(10**6) 
+0

Po prostu dziękuję! Szczerze mówiąc, zapomniałem o konstruktorze 'timedelta'. I dziękuję za "kompatybilność wsteczną") –

3

Można użyć total_seconds():

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