I would like to parse a date that can come in several formats, that I know beforehand. If I could not parse, I return nil. In ruby, I do like this:
DATE_FORMATS = ['%m/%d/%Y %I:%M:%S %p', '%Y/%m/%d %H:%M:%S', '%d/%m/%Y %H:%M', '%m/%d/%Y', '%Y/%m/%d']
def parse_or_nil(date_str)
parsed_date = nil
DATE_FORMATS.each do |f|
parsed_date ||= DateTime.strptime(date_str, f) rescue nil
end
parsed_date
end
This is concise and works. How can I do the same thing in Python?
Modifying root's answer to handle m/d/y:
There's also a yearfirst option, to prefer y/m/d.
I would just try dateutil. It can recognize most of the formats:
if you end up using datetime.strptime as suggested @RocketDonkey:
After your tip, RocketDonkey, and the one from Bakuriu, I could write a shorter version. Any problem with it?
You can use
try/except
to catch theValueError
that would occur when trying to use a non-matching format. As @Bakuriu mentions, you can stop the iteration when you find a match to avoid the unnecessary parsing, and then define your behavior whenmy_date
doesn't get defined because not matching formats are found:You can use
try/except
to catch theValueError
that would occur when trying to use a non-matching format: