所以我有这个项目清单
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,我知道这会引发一个值错误,但不是停止代码,我想要什么都不返回或者我希望代码传递这个值或者我想要更改值,然后重新运行该函数,任何这些解决方案都足够了,但我不知道该怎么做。
答案 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