2012-09-05 10 views
15

Ich habe zwei Daten und kann wie üblich Timedelta berechnen.Timedelta Multiplikation mit Float in Python

Aber ich möchte einige Prozent mit daraus resultierenden Timedelta berechnen:

full_time = (100/percentage) * timdelta 

Aber es scheint, dass es nur mit interegs multiplizieren kann.

Wie kann ich float anstelle von int als Multiplikator verwenden?

Beispiel:

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 

Wenn verwendet int(multiplier) - Genauigkeit leidet.

+0

Sie haben Recht, Timedelta unterstützt nur Multiplikation oder Division mit Intergers, aber warum führen Sie nicht die mathematischen Operationen in der Reihenfolge Schritt für Schritt? 'full_time = passed_time * 100/int (in Prozent)' –

+0

@Colin O'Coal, wegen der Genauigkeit: '2! = 2.3131'. Vergleiche: '571 * 2 = 1142' (** 19 **, 03 (3) Minuten); '571 * 2,3131 = 1320,7801 '(** 22 **, 0130016 (6) Minuten). Unterschied ist ca. ** 3 Minuten ** (!) –

Antwort

22

Sie auf insgesamt Sekunden umwandeln kann und wieder zurück:

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

timedelta.total_seconds verfügbar ist von Python 2.7; auf früheren Versionen verwenden Sie

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

nur danke! Ehrlich gesagt habe ich den Konstrukteur "Timedelta" vergessen. Und danke für die "Rückkompatibilität") –

3

könnten Sie total_seconds() verwenden:

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