2011-07-14 22 views
5

El módulo de fecha y hora da validez y matemática, lo que está bien cuando te preocupa la realidad.permitiendo fechas inválidas en python datetime

Necesito un objeto que mantenga las fechas generadas aunque no sean válidas. La hora de la fecha es demasiado estricta, ya que a veces sé solo el año o el año y el mes solamente y, a veces, tengo una fecha como 2011-02-30.

¿Hay un módulo por ahí que sea como la fecha, pero que puede manejar fechas no válidas?

Si no es así, ¿cuál es la mejor manera de manejar esto mientras se duplica la menor funcionalidad posible y aún se permite la fecha matemática cuando es posible realizarla?

ACTUALIZACIÓN

La motivación para esto es la integración con múltiples sistemas que utilizan las fechas y no se preocupan por las fechas no válidas (MySQL y Perl), además de querer la capacidad de decir rangos generales básicas de tiempo. Para la fecha difusa, las matemáticas comienzan desde el comienzo de la unidad de tiempo conocida (si sé el año y el mes pero no el día, use el primero, si sé el año pero no el mes o el día, use el primero de enero). Este último bit no es necesario, pero sería bueno y entiendo por qué no es común, ya que las personas que necesitan una fecha de caso especial de matemáticas probablemente lo compilarán ellos mismos.

Uno de los principales problemas que tengo es cargar las fechas de mysql en python usando sqlalchemy y mysqldb - si carga un valor de una columna de fecha im mysql que se parece a '2011-01-00' en mysql, obtiene Ninguno en python. Esto no es genial de ninguna manera.

+1

¿La fecha no será dura cuando no sepa cuántos días hay, por ejemplo, cada mes? Tal vez no entiendo muy bien lo que estás buscando. –

+0

@Pat B Mi suposición sería: asumir la vida real hasta que haya una partida. Además, @SynapticUnderrun Puede obtener algunas respuestas más si explica por qué quiere/necesita esto (también estoy interesado). – Wilduck

+1

Si no le importa si la fecha es válida o no, guárdela como una cadena. El módulo de fecha y hora utiliza el tiempo de época internamente, por lo que seguirá el calendario. También consulte el módulo de pytz para obtener información sobre la zona horaria si ese es el motivo por el cual le preocupa la tolerancia. – wberry

Respuesta

2

Si el módulo datetime es demasiado estricto, guárdelo como una cadena o una tupla rellenada con cero para valores desconocidos.

Edite si tiene problemas para traducir de mysql a python, escríbanos una clase de adaptador para realizar la conversión de forma segura (consulte Changing attribute behaviour).

Edit2 una simple alternativa podría ser la de escribir un guión corto para correr a través de todas sus fechas de SQL y hacer las correcciones que hay es decir, cambiar 2011-01-00 a 2011-01-01

Edit3 El los documentos sugieren que puede override reflected columns para que pueda tratar sus columnas de marca de tiempo como cadenas ... o en versiones posteriores de SQLAlchemy, puede usar the column_property para anulaciones.

+0

¿cómo obtengo mysqldb para usar mi clase en lugar de datetime? – underrun

+0

clase adaptador no suena divertido, alterando las fechas no válidas es un cambio en los datos reales que está allí (no permisible dentro del ámbito de mi proyecto, pero la opción column_property sqlalchemy se parece a lo que quiero (propiedad que es un molde() de mi columna). – underrun

0

No he oído hablar de ese módulo y no creo que haya ninguno.

Probablemente terminaré almacenando dos fechas para cada instancia: 1. la entrada original como una cadena, que podría contener cualquier cosa, incluso "N/A", solo para mostrar el valor original, y 2. analizado y objeto datetime "normalizado" que es la representación más cercana de la entrada. Dependiendo de la finalidad, permitiría objetos Null/None en los que realmente no podría estimarse (como el mencionado caso "N/A") o no. Esta solución le permitirá revertir/cambiar la "estimación" ya que no pierde ninguna información.

Si no te importa tanto, SQLAlchemy permite declarar tu propia columna y tipos de datos para convertir transparentemente dichos valores en una columna de cadena en la base de datos.

Cuestiones relacionadas