Sumar y restar horas en Python

Iniciado por PUAROT, 5 Junio 2016, 20:48 PM

0 Miembros y 1 Visitante están viendo este tema.

PUAROT

Después de mucho tiempo buscando como poder restar horas con un formato dado, lo encontré y me funciona, pero mi sorpresa llega cuando veo que para la suma no funciona :-(

Pongo el código de la resta para que lo veáis, y así si alguien busca Restar Horas le ayude:


def restar_hora(self,hora1,hora2):
        formato = "%H:%M:%S"
        h1 = datetime.strptime(hora1, formato)
        h2 = datetime.strptime(hora2, formato)
        resultado = h1 - h2
        return str(resultado)


Este código, al escribir:

restar_hora("10:30:50","09:20:30")


devuelve :
'1:10:20'

Lo que no entiendo es por que este otro código no funciona :

def sumar_hora(self,hora1,hora2):
        formato = "%H:%M:%S"
        h1 = datetime.strptime(hora1, formato)
        h2 = datetime.strptime(hora2, formato)
        resultado = h1 + h2
        return str(resultado)


este código devuelve el error :
TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'datetime.datetime'

Alguna idea de por que pasa y como solucinarlo ?

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

PUAROT

Gracias por responder,

No entiendo el motivo por el cual se pueden restar y no sumar, pero bueno, es así, que le vamos a hacer....

he estado mirando el enlace que me pusiste y he estado buscando sobre timedelta, pero mi ingles medio tirando a básico y el estar empezando con Python, no me han ayudado mucho.
He encontrado que se le pueden sumar segundos y días a una fecha y hora dada, pero no llego a ver en que formato tiene que estar esa hora... .
Me explico , yo tengo la hora en formato 00:00:00 y necesito el resultado en ese formato. Si necesito cambiar ese formato para sumar y volver a cambiar el formato para usarlo después, no me importa, pero no se como utilizar timedelta.

Podrías darme algunas nociones ? no pido que me lo hagan, si no aprender como resolver esta cuestión, ya que es la forma en la que estoy aprendiendo este lenguaje, con tutoriales y prueba error, lo cual a veces es desesperante.

Gracias otra vez !

tincopasan

hola:
perdón x lo que te diré pero debo hacerlo:
todos estamos aprendiendo, más o menos pero lo hacemos.
Muchos somos autodidactas, o sea de la misma forma que vos, manuales, prueba y error.
Si un enlace no te ayuda demasiado, pero estas orientado en lo que buscas, pues para eso existen los buscadores.
Lo del inglés ya no sirve como excusa(mi nivel es 0,0) pero... hay muchos traductores online o en soft.lamentablemente es el idioma más usado en cuanto a manuales, por eso si hago (tutorial o soft) solo lo hago en español, es mi lenguaje natal y si otro quiere leerlo pues que sepa español.
Ahora en cuanto a tu duda, hay muchas formas de hacerlo (eso es lo que más me gusta de python) así que te oriento en una.
Código (python) [Seleccionar]

# para usar timedelta hay que importarla
from datetime import datetime, timedelta

def sumar_hora(hora1,hora2):
    formato = "%H:%M:%S"
    lista = hora2.split(":")
    hora=int(lista[0])
    minuto=int(lista[1])
    segundo=int(lista[2])
    h1 = datetime.strptime(hora1, formato)
    dh = timedelta(hours=hora)
    dm = timedelta(minutes=minuto)         
    ds = timedelta(seconds=segundo)
    resultado1 =h1 + ds
    resultado2 = resultado1 + dm
    resultado = resultado2 + dh
    resultado=resultado.strftime(formato)
    return str(resultado)

print(sumar_hora("01:30:50","04:20:30"))



por último te aclaro que estás sumando fechas, o sea que 20 hs + 06 hs no es 26 sino 02 del día siguiente, por eso el ejemplo no llega ni cerca a más de 24hs(tiempo límite para el cambio)
Espero no ofenderte y si orientarte.
Saludos.

PUAROT

Ante todo GRACIAS por la respuesta.

En segundo lugar te diré que escribí la pregunta y la siguiente contestación pensando precisamente en que no me contestaran este tipo de cosas, por que se que hay mucha gente (yo mismo he caído alguna vez en ese error) que pregunta en los foros sin buscar y para que se lo den todo hecho...
Efectivamente todos estamos aprendiendo, y el que crea que no tiene un autentico problema jejeje
Respecto a lo de autodidacta, lo aclaraba simplemente por aclarar que no estoy dando clases y pretendo que me den los ejercicios resueltas, como en alguna ocasión he visto....  y que esta es mmi única forma de resolver las dudas, ya que la documentación que encuentro muchas veces está escrita para gente con mucho mas nivel, por ejemplo, lo de timedelta, los docstring están escritos para alguien que ya se mueve con soltura en el uso del lenguaje, o eso me parece a mi...
Lo del ingles para nada es una excusa, todo lo contrario , me esta sirviendo para ampliar el vocabulario, pero me cuesta entender , el problema de los traductores, (que los uso ) es que como el lenguaje también está escrito en ingles te traduce comando que seria mejor que dejara en ingles por lo que hay que filtrar muy bien y aun así no siempre sirven de ayuda.
Con todo esto, entiendo perfectamente tus comentarios, por que muchos van a lo fácil.
En mi caso se que podria haber descompuesto las horas en tuplas y anidando if hubiera encontrado la forma de hacerlo ( a lo bestia ) pero mi idea es aprender a usar las herramientas de las que dispongo
Sigo sin entender por que puedo restar horas y no sumarlas, ya que es algo de lo mas natural, hay países con horas de diferencia positivas y negativas, por ejemplo....
Estudiaré el ejemplo que me has puesto para ver si me queda claro el uso de timedelta
Muchas gracias otra vez, y perdón por la parrafada, simplemente quería aclarar que lo que quiero es aprender.