2012-09-05 15 views
15

Ho due date e posso calcolare il timedelta come al solito.Timedelta moltiplicare con float in python

Ma voglio calcolare alcuni cento con conseguente timedelta:

full_time = (100/percentage) * timdelta 

ma sembra che si può solo moltiplicando con interegs.

Come è possibile utilizzare float invece di int come moltiplicatore?

Esempio:

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 

Se viene utilizzato int(multiplier) - precisione soffre.

+0

Hai ragione, timedelta supporta solo la moltiplicazione o la divisione con interger, ma perché non eseguire le operazioni matematiche in sequenza passo dopo passo? 'full_time = tempo_passato * 100/int (percentuale)' –

+0

@Colin O'Coal, a causa della precisione: '2! = 2.3131'. Confronta: '571 * 2 = 1142' (** 19 **, 03 (3) minuti); '571 * 2.3131 = 1320,7801' (** 22 **, 0130016 (6) minuti). La differenza è di circa 3 minuti ** (!) –

risposta

22

È possibile convertire in totale secondi e viceversa:

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

timedelta.total_seconds è disponibile da Python 2.7; sulle versioni precedenti utilizzare

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

solo grazie! Onestamente ho dimenticato il costruttore di 'timedelta'. E grazie per "compatibilità retroattiva") –

3

Si potrebbe utilizzare total_seconds():

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