Używam narzędzie Pythona dateutil.parser
do parsowania niektórych dat, które otrzymuję z kanału innej firmy. Pozwala na określenie domyślnej daty, która jest domyślna na dzień dzisiejszy, do wypełniania brakujących elementów analizowanej daty. Chociaż jest to ogólnie pomocne, nie ma rozsądnego ustawienia domyślnego dla mojego przypadku użycia i wolałbym traktować częściowe daty tak, jakbym nigdy nie dostał daty (ponieważ prawie zawsze oznacza to, że otrzymałem zniekształcone dane). Pisałem następujące prace wokół:Parsowanie daty w python bez użycia domyślnego
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
(. Ten fragment wygląda tylko na dzień, jak to wszystko zależy mi na mój wniosek, ale podobna logika może być rozszerzony o komponent czasowy)
Zastanawiam się (mając nadzieję), że jest lepszy sposób na zrobienie tego. Parsowanie tego samego ciągu dwa razy tylko po to, by zobaczyć, czy wypełnia on różne wartości domyślne, wydaje się jak marnowanie zasobów.
Oto zestaw testów (z wykorzystaniem nosetest generatory) do oczekiwanego zachowania:
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
To rozwiązuje tylko pusty przypadek łańcucha. Kiedy mam częściową datę, nadal domyślnie nie określone pola, ale dostaje inną ostateczną datę niż domyślna. Dodałem kilka testów jednostkowych do pytania, aby zilustrować wymagania i gdzie ten przykład zawodzi. Dzięki za spojrzenie! –
Uważaj, najwyraźniej w swoim pierwszym przykładzie porównujesz obiekt daty z obiektem datetime. Zawsze będzie nierówne. –