Parsing a date that can be in several formats in python

前端 未结 4 1494
陌清茗
陌清茗 2020-12-02 01:47

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_FORM         


        
相关标签:
4条回答
  • 2020-12-02 02:09

    I would just try dateutil. It can recognize most of the formats:

    from dateutil import parser
    parser.parse(string)
    

    if you end up using datetime.strptime as suggested @RocketDonkey:

    from datetime import datetime
    
    def func(s,flist):
        for f in flist:
            try:
                return datetime.strptime(s,f)
            except ValueError:
                pass
    
    0 讨论(0)
  • 2020-12-02 02:11

    Modifying root's answer to handle m/d/y:

    from dateutil import parser
    parser.parse(string, dayfirst=False)
    

    There's also a yearfirst option, to prefer y/m/d.

    0 讨论(0)
  • 2020-12-02 02:23

    You can use try/except to catch the ValueError 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 when my_date doesn't get defined because not matching formats are found:

    You can use try/except to catch the ValueError that would occur when trying to use a non-matching format:

    from datetime import datetime
    
    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']
    test_date = '2012/1/1 12:32:11'
    
    for date_format in DATE_FORMATS:
        try:
            my_date = datetime.strptime(test_date, date_format)
        except ValueError:
            pass
        else:
          break
    else:
      my_date = None
    
    print my_date # 2012-01-01 12:32:11
    print type(my_date) # <type 'datetime.datetime'>
    
    0 讨论(0)
  • 2020-12-02 02:26

    After your tip, RocketDonkey, and the one from Bakuriu, I could write a shorter version. Any problem with it?

    def parse_or_none(date):
        for date_format in DATE_FORMATS:
            try:
                return datetime.strptime(date, date_format)
            except ValueError:
                pass
        return None
    
    0 讨论(0)
提交回复
热议问题