尝试循环内部循环日期解析Python

时间:2017-12-04 19:19:05

标签: python date try-except

所以我有这个项目清单

Cool beans 12/13/2016  12:00:00 AM
12/15/2016 0:00
10/28/2016 0:00
11/22/2006 0:00
3/31/2017 0:00
1/23/2017 0:00
9/2/2016 0:00
8/18/2016 0:00
2/23/2017 0:00
8/3/2016 0:00
5/11/2010 0:00
10/11/2016 0:00
4/25/2017 0:00
8/29/2016 0:00
5/31/2017 0:00
4/14/2017 0:00
4/6/2016 0:00
12/11/2014 0:00
1/31/2017 0:00
10/12/2010 0:00

我使用以下函数来解析日期

def try_parsing_date(text):
    for fmt in ('%m/%d/%Y', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M', '%Y/%m/%d', '%Y/%m/%d %H:%M:%S', '%Y/%m/%d %H:%M'):
        try:
            return datetime.strptime(text, fmt).strftime('%Y/%m/%d')
        except ValueError:
            pass
    raise ValueError('no valid date format)

除了提高值错误之外,还有一种方法可以将文本更改为其他日期或只是让函数继续?在我的列表的第一个条目中,我添加了单词cool beans,我知道这会引发一个值错误,但不是停止代码,我想要什么都不返回或者我希望代码传递这个值或者我想要更改值,然后重新运行该函数,任何这些解决方案都足够了,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

您当前的方法存在的问题是,如果您已经用尽所有尝试为日期时间获取正确的字符串格式,则会自动raise ValueError('no valid date format)。相反,您可以保持字符串不变,也可以返回默认日期字符串。

对于后者:

def try_parsing_date(text):
    for fmt in ('%m/%d/%Y', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M', '%Y/%m/%d', '%Y/%m/%d %H:%M:%S', '%Y/%m/%d %H:%M'):
        try:
            return datetime.strptime(text, fmt).strftime('%Y/%m/%d')
        except ValueError:
            pass
    return '1900/01/01'

或者,没有return任何内容的函数会自动将None返回给调用者,因此您可以简单地执行:

def try_parsing_date(text):
    for fmt in ('%m/%d/%Y', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M', '%Y/%m/%d', '%Y/%m/%d %H:%M:%S', '%Y/%m/%d %H:%M'):
        try:
            return datetime.strptime(text, fmt).strftime('%Y/%m/%d')
        except ValueError:
            pass

然后使用以下函数在函数外部处理它:

if not try_parsing_date(some_string): # OR if try_parsing_date(some_string) is None:
    # Do something here