Re: Aritmética de fechas

Pablo Rey Sobral pabloreysobral en gmail.com
Mar Ene 4 03:27:25 CET 2005


Hola,

> Hola,
> 
> El otro día había leído comentarios sobre aritmética de fechas y que no
> tenía mucho sentido. Depende para qué. Siempre que esté bien definida sí
> tiene sentido. Sólo por curiosidad,  y para que los programadores de
> Python lo entiendan, en Visual Basic sí existe una función de aritmética
> de fechas que se llama DateAdd:
> 
> VB:
> ?DateAdd("m",1,CDate("31/01/2005"))
> 28/02/2005
> 
> que no es lo mismo que:
> ?DateAdd("d",30,CDate("31/01/2005"))
> 02/03/2005

A ver si esto te soluciona la curiosidad:

from datetime import datetime, timedelta

def DiasMes(f):
    if f.month in (1,3,5,7,8,10,12):
        return 31
    elif f.month in (4,6,9,11):
        return 30
    else:  # febrero
        if (f.year % 4) == 0 and not((f.year % 400) in (100,200,300)):
            return 29   
        else:
            return 28

def SumaMeses(delta, ini):
    res = ini.replace(day=1)
    for x in range (0,delta):
        res += timedelta(DiasMes(res))

    if ini.day > DiasMes(res):
        return res.replace(day = DiasMes(res))
    else:
        return res.replace(day = ini.day)

x = datetime(2000,1,31)
print SumaMeses(1,x)


> (siendo el intervalo "m" = mes y "h" = hora).
> 
> Es decir, al sumar un mes, en este caso no pasa al mes siguiente si este
> no tiene los días necesarios. Supongo que no será muy difícil
> implementar eso en Python. (tampoco hay tantos periodos: segundo,
> minuto, hora, día, mes, año)
> 
> Erny

El resto de sumas puedes hacerlos con timedelta directamente:

datetime(2005,1,31) + timedelta (days = 30)
datetime(2005,1,31) + timedelta (seconds = 55)
....

Un saludo.




Más información sobre la lista de distribución Python-es