Sto usando lo strumento dateutil.parser
di python per analizzare alcune date che sto ricevendo da un feed di terze parti. Permette di specificare una data di default, che a sua volta è impostata per default, per riempire gli elementi mancanti della data analizzata. Sebbene questo sia in generale di aiuto, non esiste un predefinito corretto per il mio caso d'uso, e preferirei trattare date parziali come se non avessi ottenuto una data (poiché quasi sempre ho ottenuto dati confusi). Ho scritto il seguente lavoro intorno:Analizzare una data in python senza usare un valore predefinito
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
(. Questo frammento guarda solo alla data, come è tutto quello che mi interessa per la mia domanda, ma la logica simile potrebbe essere esteso per includere la componente temporale)
Mi chiedo (sperando) ci sia un modo migliore per farlo. L'analisi della stessa stringa due volte solo per vedere se si riempie di valori predefiniti diversi sembra un enorme spreco di risorse, per non dire altro.
Ecco la serie di test (utilizzando generatori nosetest) per il comportamento previsto:
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
Questo risolve solo la stringa vuota. Quando ho una data parziale, è ancora predefinito i campi non specificati, ma ottiene una data finale diversa da quella predefinita. Ho aggiunto alcuni test unitari alla domanda per illustrare i requisiti e dove questo esempio fallisce. Grazie per aver dato un'occhiata però! –
Fai attenzione, apparentemente nel tuo primo esempio stai confrontando un oggetto data con un oggetto datetime. Sarà sempre non-uguale. –