Search code examples
python-datetime

Python Datetime string parsing: How to know what has been parsed?


I want to use Python to parse a user input string and need to know which portion of date has been specified, e.g.,

"Jan. 2017" => Month = 1, Year = 2017

The result should tell me only month and year are specified in the string, and return those values, while:

"2003-05-01"

specifies day, month and year.

I tried to use dateutil.parser.parse, and gave it a rare default date value. e.g., 1900/01/01, and then compare the parsed result with the default date and see the difference. But if the month or day are both 1 in the parsed result, it needs one more round of parsing with a different default value, in order to rule out the possibility of it being the default value, or from the user input.

The above way seems quirky. Is there a library for me to parse commonly used date string format and knowing what has been parsed?


Solution

  • I ended up doing the quirky way:

    from dateutil.parser import parse
    # parse the date str, and return day/month/year specified in the string.
    # the value is None if the string does not have information
    def parse_date(date_str):
        # choose two different dates and see if two parsed results
        default_date1 = datetime.datetime(1900, 1, 1, 0, 0)
        default_date2 = datetime.datetime(1901, 12, 12, 0, 0)
        year = None
        month = None
        day  = None
        try:
            parsed_result1 = parse(date_str, default=default_date1)
            parsed_result2 = parse(date_str, default=default_date2)
            if parsed_result1.year == parsed_result2.year: year = parsed_result2.year
            if parsed_result1.month == parsed_result2.month: month = parsed_result2.month
            if parsed_result1.day == parsed_result2.day: day = parsed_result2.day
            return year, month, day
        except ValueError:
            return None, None, None