Manejando fechas con python

O como descubrir que si se hacen bien las cosas evitan muchos dolores de cabeza.

Llevo más de 10 años programando en Java y más de 12 programando en general, si me restrinjo a mi vida laboral pues estamos hablando de siete años en Java y seis meses en Python. No entrare a discutir las virtudes y defectos de cada lenguaje, cada uno tiene lo suyo, pero no puedo evitar comparar el manejo de fechas que ha sido un dolor de cabeza en los diferentes proyectos que hemos realizado con Java y que por el momento esta siendo una delicia con Python.

Una pequeña muestra de lo que se puede hacer con el manejo de fechas con Python, mediante la libreria python-dateutil.

Primero instalamos la libreria python-dateutil.

easy_install python-dateutil

A continuación podemos crear un script con el código de ejemplo o lo ejecutamos en la consola intercativa de Python:

from dateutil.relativedelta import *
from dateutil.easter import *
from dateutil.rrule import *
from dateutil.parser import *
from datetime import *

today = date.today()
year = rrule(YEARLY,bymonth=8,bymonthday=16,byweekday=FR)[0].year
rdelta = relativedelta(easter(year), today)
print "Hoy es:", today
print "El próximo año en que el 13 de agosto es viernes es el :", year
print "Faltan %s días para el Día de Pascua." %(rdelta)
print "Pascua de ese año es el %s." %(today+rdelta)

El resultado de ejecutar este código es:

Hoy es: 2009-02-06
El próximo año en que el 13 de agosto es viernes es el : 2010
Faltan relativedelta(years=+1, months=+1, days=+29) días para el Día de Pascua.
Pascua de ese año es el 2010-04-04.

Simple y potente, especialmente las rrule, que nos permiten encontrar todos los días que cumplen un cierto patrón. En este caso, buscamos con frecuencia anual, un día de la semana viernes, que sea día 13 del mes de agosto, el primer día que cumple este patrón es en el año 2010, nos devuelve un iterador con todos los días que cumplen esta regla, de cual nosotros queremos conocer el primer año en cumplirla.Esto, son utilidades aparte de las que ya nos ofrece el propio lenguaje de ‘serie’, como restar fechas, añadir o restar periodos,…, por ejemplo hoy más dos días seria tan sencillo como:

import datetime
pasado_manyana = date.today() + timedelta(days=2)
print pasado_manyana
2009-02-08

Y mucho más.

La ingenieria informática

Estaba contestando un post de Galli y la respuesta me ha salido interminable, así que lo he convertido en un articulo.

Yo nunca me he imaginado la profesión de programador similar a la de arquitecto, ingeniero de caminos, ingeniero industrial, etc. Siempre he considerado un error garrafal separar el desarrollo del concepto de su producción, es cierto que la implementación tiene diferentes niveles de abstracción y que seguramente se requieren conocimientos del dominio que no pueden estar en posesión del desarrollador y que por tanto se deberá colaborar con otros expertos, pero no a alguien que crea un plano y otro que lo ejecuta de forma totalmente inconexa; a grandes rasgos yo identifico más a la informática con la práctica sanitaría. Espero ser capaz de explicar mi punto de vista.

La medicina tiene muchísima información y conocimiento sobre el cuerpo humano su estructura y funcionamiento, su misión es hacer que funcione adecuadamente. Para ello existe un lenguaje formal que permite que dos médicos se entiendan. Ahora viene mi vuelta de tuerca, el programador no es un médico, sino un farmacéutico capaz de generar mediante ese lenguaje formal soluciones a determinadas necesidades, por ejemplo reducir la presión sanguínea de la cabeza que genera dolor. Otro farmacéutico es el que vende esa solución al paciente y el médico que mantiene el hardware funcionando.

Nadie en su sano juicio exigiría al médico que crear un fármaco, por más que usen el mismo lenguaje formal y que la formación de uno y otro sea similar, nadie espera de una empresa farmacéutica que tenga proyectada la creación de un fármaco, no obstante si se debe exigir que haya una sistemática de trabajo que reduzca los errores, que se pruebe, que se contrate a los mejores y que se dedique el tiempo necesario a hacerlo lo mejor posible.

Creo que la explicación no ha sido brillante, pero espero haber transmitido los fundamentos de la idea, el ordenador es un instrumento complejo, para el que crear una solución depende de muchos factores no controlables fácilmente a priori y que si hay una profesión similar esta sería la sanitaria (en general) y no desde luego la construcción, simplista en demasía,  ya sea de edificios, carreteras, puentes o la fabricación de maquinas.

Según este paradigma deberiamos diferenciar entre los que crean soluciones (farmaceuticos-programadores), los que las implantan (médicos-ingenieros de sistemas/consultores), los que controlan su implantación (enfermeros-tecnicos de sistemas) y los usuarios (auxiliares, celadores -helpdesk). Es una metafora que a mi me sirve mejor para entender nuestra profesión.