Ver Mensaje Individual
  #10 (permalink)  
Antiguo 23/11/2011, 19:54
Avatar de wilmermorel
wilmermorel
 
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Suma de meses a una fecha en python

Eres un monstruo razpeitia! deberías hablar con Guido para que incluya tu código en los módulos de Python jejeje. Precisamente la incluire yo en un módulo mio.
Ya que estamos alimentando el tema, paso el código del modulo, para que me den su critica constructiva. De camino preciso saber como, en la funcion GetEdad (que obtengo un objeto timedelta con los dias) como puedo pasarlos a años?

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from Excepciones import * #excepciones predefinidas
  5. import webkit             #logra hacer que el formato de la fecha sea igual a la conf regional.???
  6. from datetime import *
  7.  
  8. class FechaHora():        
  9.     def GetHoy(self, texto=False):
  10.         """retorna el la fecha actual, si texto=True, la devuelve en modo texto.
  11.        GetHoy(texto=False)
  12.        """
  13.         if texto:
  14.             return self.SetFechaTexto()
  15.         else:
  16.             return datetime.today()
  17.    
  18.     def SetFecha(self, texto=False, *fecha):
  19.         """retorna la fecha indicada como segundo parametro, al formato ideal.
  20.        *fecha = (1988, 05, 07) >>> 07/05/1988, si el valor del parametro
  21.        *fecha es un string, se asume que la fecha esta en ese formato y se
  22.        quiere pasar a formato datetime o date (segun haiga una hora o no).
  23.        si el parametro texto = True retorna la fecha en modo texto
  24.        >>> sabado 07 de Mayo del 1988
  25.         """
  26.         if not fecha:
  27.             raise FechaHoraError("""Debe especificar una fecha en parametro 2
  28.                  SetFecha(texto=False, *fecha)""")
  29.                  
  30.         if len(fecha) == 1:
  31.             if isinstance(fecha[0], basestring):
  32.                 #si hay comas, se remplazan por espacios
  33.                 fecha = fecha[0].replace(",", " ")
  34.                 #verifica que tipo de divicion tiene (- / )
  35.                 buscarbarra = fecha.find("/")
  36.                 buscarguion = fecha.find("-")
  37.                
  38.                 #si la division es con barras----------------------------------
  39.                 if buscarbarra != -1:
  40.                     dia, mes, anoyhora = fecha.split("/")
  41.                    
  42.                     #se verifica si hay una hora indicada
  43.                     if anoyhora.find(":") != -1:
  44.                         #contar los espacios en que esta dividida
  45.                         espacios = anoyhora.count(" ")
  46.                         ano, hora = anoyhora.split(" " * espacios)
  47.                         horas, minutos, segundos = hora.split(":")
  48.                     else:
  49.                         ano = anoyhora
  50.                         horas, minutos, segundos = False, False, False
  51.                
  52.                 #si la divicion es con guion-----------------------------------
  53.                 elif buscarguion != -1:
  54.                     dia, mes, anoyhora = fecha.split("-")
  55.                    
  56.                     #se verifica si hay una hora indicada
  57.                     if anoyhora.find(":") != -1:
  58.                         #contar los espacios en q esta dividida
  59.                         espacios = anoyhora.count(" ")
  60.                         ano, hora = anoyhora.split(" " * espacios)
  61.                         horas, minutos, segundos = hora.split(":")
  62.                     else:
  63.                         ano = anoyhora
  64.                         horas, minutos, segundos = False, False, False
  65.                 else:
  66.                     return None
  67.                    
  68.                 #si el dia es mayor a 31, se asume que es el año---------------
  69.                 try:
  70.                     if int(dia) > 31:
  71.                         dia2 = ano
  72.                         ano = dia
  73.                         dia = dia2
  74.                 except ValueError:
  75.                     raise FechaHoraError(u"""La fecha indicada, no es valida,
  76.                          el dia, mes, año, hora, minutos, segundos que se
  77.                          especifiquen, deben ser caracteres numericos
  78.                          no """+dia+"/"+mes+"/"+ano)
  79.                 try:
  80.                     fecha = datetime(int(ano), int(mes), int(dia),
  81.                                    int(horas), int(minutos), int(segundos))
  82.                     if horas is False:
  83.                         fecha = date(int(ano), int(mes), int(dia))
  84.                 except ValueError as e:
  85.                     raise FechaHoraError(e)
  86.  
  87.                 if texto:
  88.                     #si no hay hora, no se indica en texto---------------------
  89.                     if horas is False:
  90.                         return self.SetFechaTexto(fecha, False)
  91.                     else:
  92.                         return self.SetFechaTexto(fecha, True)
  93.                 else:
  94.                     return fecha
  95.         #-------------------------------------------------------------------------------------------------------------
  96.         else:
  97.             if len(fecha) == 3:
  98.                 try:
  99.                     #si hay 3 elementos, se crear un objeto date
  100.                     fecha = date(*fecha)
  101.                 except ValueError:
  102.                     #si el dia no es valido, y es mayor a 31, se invierte la tupla convirtiendola en lista
  103.                     if fecha[2] > 31:
  104.                         fecha = list(fecha)
  105.                         fecha.reverse()
  106.                         try:
  107.                             fecha = date(*fecha)
  108.                         except ValueError as e:
  109.                             raise FechaHoraError(e)
  110.                     else:
  111.                         raise FechaHoraError("""Los datos introducidos para
  112.                        la creacion de la fecha, no son validos. """+str(fecha))
  113.             elif len(fecha) > 3:
  114.                 #si hay mas de 3 elementos, se crea un obj datetime
  115.                 try:
  116.                     fecha = datetime(*fecha)
  117.                 except ValueError:
  118.                     #si el dia no es valido, y es mayor a 31, se cambia este por el año
  119.                     if fecha[2] > 31:
  120.                         dia = fecha[0]
  121.                         ano = fecha[2]
  122.                         fecha = list(fecha)
  123.                         fecha[0] = ano
  124.                         fecha[2] = dia
  125.                         try:
  126.                             fecha = datetime(*fecha)
  127.                         except ValueError as e:
  128.                             raise FechaHoraError(e)
  129.                     else:
  130.                         raise FechaHoraError("""Los datos introducidos para
  131.                        la creacion de la fecha, no son validos. """+str(fecha))
  132.             try:
  133.                 #se formatea la fecha------------------------------------------
  134.                 if isinstance(fecha, datetime):
  135.                     fecha_str =datetime.strftime(fecha,"%d/%m/%Y %H:%M:%S")
  136.                     #si el retorno debe ser fecha en texto
  137.                     if texto:
  138.                         return self.SetFechaTexto(fecha, True)
  139.                     else:
  140.                         return fecha_str
  141.                
  142.                 elif isinstance(fecha, date):
  143.                     fecha_str =date.strftime(fecha,"%d/%m/%Y")
  144.                     #si el retorno debe ser fecha en texto
  145.                     if texto:
  146.                         return self.SetFechaTexto(fecha, False)
  147.                     else:
  148.                         return fecha_str
  149.             except BaseException as e:
  150.                 raise FechaHoraError(str(e))
  151.                
  152.    
  153.        
  154.     def GetHora(self):
  155.         """Devuelve la hora actual en formato string"""
  156.         hora_str = datetime.strftime(datetime.today(), "%H:%M:%S")
  157.         return hora_str
  158.    
  159.     def GetFecha(self, texto=False):
  160.         """Debuelve la fecha actual en formato string. si texto es True, devuelve
  161.        la fecha en formato texto
  162.        >>> GetFecha()      ->  07/05/1988
  163.        >>> GetFecha(True)  ->  Sábado 7 de mayo del 1988
  164.        """
  165.         fecha_str = datetime.strftime(datetime.today(), "%d/%m/%Y")
  166.         if texto:
  167.             return self.SetFechaTexto(fecha_str, False)
  168.         else:
  169.             return fecha_str
  170.    
  171.     def GetEdad(self, fecha):
  172.         """Devuelve un objeto 'datetime.timedelta' con el tiempo exacto desde la
  173.        fecha indicada hasta hoy. El parametro 1 'fecha', puede ser un objeto
  174.        date, datetime, o una cadena de texto, este ultimo debe ser en
  175.        formato 'dia/mes/año' o 'dia-mes-año'.
  176.        """
  177.         if isinstance(fecha, basestring):
  178.             try:
  179.                 fecha = self.SetFecha(False, fecha)
  180.             except FechaHoraError as e:
  181.                 raise FechaHoraError(e)
  182.         if isinstance(fecha, datetime):
  183.             print 1
  184.             return datetime.today() - fecha
  185.         elif isinstance(fecha, date):
  186.             print 2
  187.             return date.today() - fecha
  188.         else:
  189.             raise FechaHoraError("""Error calculando la fecha,
  190.                                 la fecha indicada no es correcta.""")
  191.                
  192.     def SetFechaTexto(self, fecha=None, hora=True):
  193.         """Formatea la fecha a formato texto.
  194.        hoy = datetime.datetime.today()   >> 1988-05-07 10:30:27.548789
  195.        fecha_texto = SetFechaTexto(hoy)  >> sábado 07 de mayo del 1988, 10:30:27
  196.        si el parametro hora = False, devolvera solo la fecha.
  197.        """
  198.         if fecha == None:
  199.             fecha = datetime.today()
  200.         if isinstance(fecha, basestring):
  201.             fecha = self.SetFecha(False, fecha)
  202.         try:
  203.             date_text = datetime.strftime(fecha, "%A %d de %B del %Y")
  204.             time_text = datetime.strftime(fecha, "%H:%M:%S")
  205.         except BaseException as e:
  206.             raise FechaHoraError(e)
  207.         else:
  208.             if hora == False:
  209.                 return date_text
  210.             else:
  211.                 return date_text+", "+time_text