zac*_*con 39 python string macos datetime date
如何检查字符串是否可以解析为日期?
这些都是有效的日期.如果对第3项和上一项中的内容之间缺乏空间有任何疑虑,可以通过在字母/字符和数字之间自动插入空格(如果需要)来轻松解决.
但首先,基础知识:
我试过把它放在if statement:
if datetime.strptime(item, '%Y') or datetime.strptime(item, '%b %d %y') or datetime.strptime(item, '%b %d %Y') or datetime.strptime(item, '%B %d %y') or datetime.strptime(item, '%B %d %Y'):
Run Code Online (Sandbox Code Playgroud)
但是这是在try-except块中,并且不断返回这样的内容:
16343 time data 'JUNE1890' does not match format '%Y'
Run Code Online (Sandbox Code Playgroud)
除非,它符合if声明中的第一个条件.
为了澄清,我实际上并不需要日期的价值 - 我只是想知道它是否是.理想情况下,它会是这样的:
if item is date:
print date
else:
print "Not a date"
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
Ale*_*ley 75
看看中的parse功能dateutils.parser.它能够将几乎任何字符串解析为datetime对象.
如果您只是想知道特定字符串是否可以表示日期,您可以尝试以下函数:
from dateutil.parser import parse
def is_date(string, fuzzy=False):
"""
Return whether the string can be interpreted as a date.
:param string: str, string to check for date
:param fuzzy: bool, ignore unknown tokens in string if True
"""
try:
parse(string, fuzzy=fuzzy)
return True
except ValueError:
return False
Run Code Online (Sandbox Code Playgroud)
然后你有:
>>> is_date("1990-12-1")
True
>>> is_date("2005/3")
True
>>> is_date("Jan 19, 1990")
True
>>> is_date("today is 2019-03-27")
False
>>> is_date("today is 2019-03-27", fuzzy=True)
True
>>> is_date("Monday at 12:01am")
True
>>> is_date("xyz_not_a_date")
False
>>> is_date("yesterday")
False
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是:parse可能会将某些字符串识别为您不希望将其视为日期的日期,例如"12"将被解析为"1999".如果要捕获这些情况,可能需要额外的检查.
daw*_*awg 12
如果要解析这些特定格式,可以只匹配格式列表:
txt='''\
Jan 19, 1990
January 19, 1990
Jan 19,1990
01/19/1990
01/19/90
1990
Jan 1990
January1990'''
import datetime as dt
fmts = ('%Y','%b %d, %Y','%b %d, %Y','%B %d, %Y','%B %d %Y','%m/%d/%Y','%m/%d/%y','%b %Y','%B%Y','%b %d,%Y')
parsed=[]
for e in txt.splitlines():
for fmt in fmts:
try:
t = dt.datetime.strptime(e, fmt)
parsed.append((e, fmt, t))
break
except ValueError as err:
pass
# check that all the cases are handled
success={t[0] for t in parsed}
for e in txt.splitlines():
if e not in success:
print e
for t in parsed:
print '"{:20}" => "{:20}" => {}'.format(*t)
Run Code Online (Sandbox Code Playgroud)
打印:
"Jan 19, 1990 " => "%b %d, %Y " => 1990-01-19 00:00:00
"January 19, 1990 " => "%B %d, %Y " => 1990-01-19 00:00:00
"Jan 19,1990 " => "%b %d,%Y " => 1990-01-19 00:00:00
"01/19/1990 " => "%m/%d/%Y " => 1990-01-19 00:00:00
"01/19/90 " => "%m/%d/%y " => 1990-01-19 00:00:00
"1990 " => "%Y " => 1990-01-01 00:00:00
"Jan 1990 " => "%b %Y " => 1990-01-01 00:00:00
"January1990 " => "%B%Y " => 1990-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41207 次 |
| 最近记录: |