example - Python timedelta problema con valores negativos
set datetime python (2)
¿Por qué?
Posiblemente como efecto secundario no deseado de la forma en que se definen //
y %
.
Posiblemente porque facilita la implementación de la clase datetime
. Cinco minutos antes de la época son las 23:55, no 0: -5.
Realmente no importa Solo sepan que es así como se normalizan los days
, seconds
y microseconds
. Y que puede ser fácilmente resuelto.
def format_timedelta(td):
if td < timedelta(0):
return ''-'' + format_timedelta(-td)
else:
# Change this to format positive timedeltas the way you want
return str(td)
>>> format_timedelta(timedelta(minutes=-5))
''-0:05:00''
Hola, necesito ayuda para entender por qué sucede esto. Tengo un método para rastrear el "tiempo restante" en un programa de eventos:
def get_program_time_budget(self):
return self.estimated_duration-self.get_program_duration()
Todo bien cuando se estima que la duración_durida> self.get_program_duration (), pero cuando esto va de otra manera, las cosas se ponen divertidas.
Los resultados se muestran al usuario:
Estimated 11 hours Allocated 10 hours 55 minutes Remaining 5 minutes
Cuando el resultado se vuelve negativo, hace 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?
EDITAR: Aquí está el formateador de timedelta (tenga en cuenta que este es un filtro de Django, por lo que recibe el valor de timedelta como un 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
Si está utilizando Python 2.7 o superior, puede usar timedelta.total_seconds()
para obtener una representación float
de timedelta como un número positivo o negativo de segundos.
>>> datetime.timedelta(-1, 86100).total_seconds()
-300.0
Debería poder usar esto para calcular una cantidad de minutos con bastante facilidad.
Si no está usando Python 2.7, puede usar la siguiente fórmula equivalente de los documentos:
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10.0**6
Edición: parece que probablemente esté usando la representación de cadena predeterminada para que timedelta muestre el resultado, por lo que mi respuesta original puede no ser tan útil. Sugeriría algo como esto para mostrar el resultado:
def get_program_time_budget(self):
td = self.estimated_duration-self.get_program_duration()
if td.days < 0:
return ''-'' + str(datetime.timedelta() - td)
return str(td)
Esto ahora devolvería una cadena en lugar de un timedelta, y para timedeltas negativas, antepondría un ''-'' a un timedelta positivo.