尝试循环内部 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
所以我有这个项目列表
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