Estoy usando la herramienta dateutil.parser
de python para analizar algunas fechas que obtengo de un feed de terceros. Permite especificar una fecha predeterminada, que por defecto es la actual, para completar los elementos faltantes de la fecha analizada. Si bien esto es útil en general, no existe una falla en el sistema para mi caso de uso, y preferiría tratar las fechas parciales como si no hubiera tenido una fecha (ya que casi siempre significa que obtuve datos confusos). He escrito el siguiente trabajo en torno a:Analizando una fecha en python sin usar un valor predeterminado
from dateutil import parser
import datetime
def parse_no_default(dt_str):
dt = parser.parse(dt_str, default=datetime.datetime(1900, 1, 1)).date()
dt2 = parser.parse(dt_str, default=datetime.datetime(1901, 2, 2)).date()
if dt == dt2:
return dt
else:
return None
(. Este fragmento sólo se ve en la fecha, ya que eso es todo lo que importa para mi aplicación, pero la lógica similar podría ampliarse para incluir el componente de tiempo)
Me pregunto (con la esperanza) que hay una mejor manera de hacerlo. Analizar la misma cadena dos veces solo para ver si cumple diferentes valores predeterminados parece una gran pérdida de recursos, por decir lo menos.
Aquí está el conjunto de pruebas (usando generadores nosetest) para el comportamiento esperado:
import nose.tools
import lib.tools.date
def check_parse_no_default(sample, expected):
actual = lib.tools.date.parse_no_default(sample)
nose.tools.eq_(actual, expected)
def test_parse_no_default():
cases = (
('2011-10-12', datetime.date(2011, 10, 12)),
('2011-10', None),
('2011', None),
('10-12', None),
('2011-10-12T11:45:30', datetime.date(2011, 10, 12)),
('10-12 11:45', None),
('', None),
)
for sample, expected in cases:
yield check_parse_no_default, sample, expected
Eso solo resuelve la caja vacía. Cuando tengo una fecha parcial, todavía está incumpliendo los campos no especificados, pero obtiene una fecha final diferente a la predeterminada. He agregado algunas pruebas unitarias a la pregunta para ilustrar los requisitos y dónde falla este ejemplo. ¡Gracias por echar un vistazo! –
Tenga cuidado, aparentemente en su primer ejemplo está comparando un objeto de fecha con un objeto de fecha y hora. Siempre va a ser no igual. –