2012-09-05 9 views
15

Tengo dos fechas y puedo calcular timedelta como de costumbre.Timedelta se multiplica con flotador en python

Pero quiero para calcular algunos ciento con timedelta resultante:

full_time = (100/percentage) * timdelta 

pero parece que sólo puede multiplicarse con interegs.

¿Cómo puedo usar float en lugar de int como multiplicador?

Ejemplo:

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 

Si se utiliza int(multiplier) - exactitud sufre.

+0

Tiene razón, timedelta solo admite la multiplicación o división con intergers, pero ¿por qué no realiza las operaciones matemáticas en secuencia paso a paso? 'full_time = passed_time * 100/int (percentage)' –

+0

@Colin O'Coal, debido a la precisión: '2! = 2.3131'. Compare: '571 * 2 = 1142' (** 19 **, 03 (3) minutos); '571 * 2.3131 = 1320,7801' (** 22 **, 0130016 (6) minutos). La diferencia es aproximadamente ** 3 minutos ** (!) –

Respuesta

22

Puede convertir el total de segundos y viceversa:

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

timedelta.total_seconds está disponible a partir de Python 2.7; en versiones anteriores use

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

¡sólo gracias! Honestamente me olvidé del constructor 'timedelta'. Y gracias por "compatibilidad de respaldo") –

3

Usted podría utilizar total_seconds():

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