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

Try loop inside for loop date parsing Python

所以我有这个项目列表

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 一词,我知道这会引发值错误,但我不想停止代码,而是不想返回任何内容,或者我希望代码传递这个值,或者我想更改值然后重新运行该函数,这些解决方案中的任何一个都可以,但我不知道该怎么做。

您当前方法的问题在于,一旦您用尽所有尝试为您的日期时间获取正确的字符串格式,您会自动 raise ValueError('no valid date format)。相反,您可以 return 不变的字符串,或者 return 默认日期字符串。

对于后者:

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 任何东西的函数会自动 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