Hola, necesito ayuda para entender por qué sucede esto. que tienen un método para realizar un seguimiento 'tiempo restante' en un programa de eventos:Python timedelta problema con valores negativos
def get_program_time_budget(self):
return self.estimated_duration-self.get_program_duration()
Todo bien cuando el estimated_duration> self.get_program_duration() pero cuando esto va en sentido contrario las cosas se ponen divertido.
Los resultados se muestran al usuario:
Estimated 11 hours Allocated 10 hours 55 minutes Remaining 5 minutes
Cuando el resultado se vuelve negativa que tiene esto:
Estimated 11 hours Allocated 11 hours 5 minutes Remaining -1 day 23 hours 55 minutes
Alguna idea de cómo obtener el resultado -5 minutos?
EDIT: Aquí es el formateador timedelta (Tenga en cuenta que este es un filtro de Django, por lo que recibe el valor timedelta como str - pero se almacena como un timedelta):
def format_duration(value):
try:
delim = ':'
toks = value.split(',')
hour = minute = ''
d_string = value.count('day') and toks[0] or ''
h, m, s = d_string and toks[-1].strip().split(delim) or value.split(delim)
try:
hour = int(h)
except:
pass
try:
minute = int(m)
except:
pass
h_string = "%s%s%s" % (hour and hour or '', (hour and ' hour' or ''),(hour and hour > 1 and 's' or '') )
m_string = "%s%s%s" % (minute and minute or '', (minute and ' minute' or ''),(minute and minute > 1 and 's' or ''))
return "%s %s %s" % (d_string, h_string, m_string)
except Exception, e:
logging.error("Error in format_duration -> %s. Duration value=%s" % (e, value))
return ''v
This _is_ the way 'timedelta' funciona a valores negativos. Los resultados siempre se normalizan de modo que solo el valor de 'días' sea negativo. ¿Le gustaría negar los otros campos si el valor del día fuera, por ejemplo, -5? –
Sabemos cómo restar dos timedeltas. Lo que no sabemos es qué código usó para mostrar el resultado. Para un mejor consejo, por favor divulgue. –
Si quiere trabajar con valores de timedelta negativos de una manera sensata ("-1 minuto" es solo "-1 minuto" y ** no ** "-1 día más 23h59"), puede usar el módulo 'relativetimedelta' presente en [dateutil] (http://labix.org/python-dateutil). – florisla