Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查字符串是否有日期、任何格式_Python_String_Macos_Date_Datetime - Fatal编程技术网

Python 检查字符串是否有日期、任何格式

Python 检查字符串是否有日期、任何格式,python,string,macos,date,datetime,Python,String,Macos,Date,Datetime,如何检查字符串是否可以解析为日期 1990年1月19日 1990年1月19日 1990年1月19日 1990年1月19日 1990年1月19日 1990年 1990年1月 1990年1月1日 这些都是有效日期。如果对第#3项和上面最后一项中的内容之间缺少空格有任何担心,可以通过在字母/字符和数字之间自动插入空格(如果需要)轻松解决 但首先,最基本的是: 我试着把它放在一个if语句中: if datetime.strptime(item, '%Y') or datetime.strptime(

如何检查字符串是否可以解析为日期

  • 1990年1月19日
  • 1990年1月19日
  • 1990年1月19日
  • 1990年1月19日
  • 1990年1月19日
  • 1990年
  • 1990年1月
  • 1990年1月1日
这些都是有效日期。如果对第#3项和上面最后一项中的内容之间缺少空格有任何担心,可以通过在字母/字符和数字之间自动插入空格(如果需要)轻松解决

但首先,最基本的是:

我试着把它放在一个
if语句中

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'):
但这是在try-except块中,并不断返回如下内容:

16343 time data 'JUNE1890' does not match format '%Y'
if item is date:
    print date
else:
    print "Not a date"
除非满足
if
语句中的第一个条件

为了澄清,我实际上并不需要日期的值——我只是想知道它是否是。理想情况下,应该是这样的:

16343 time data 'JUNE1890' does not match format '%Y'
if item is date:
    print date
else:
    print "Not a date"
有什么方法可以做到这一点吗?

中的函数能够将许多日期字符串格式解析为
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
那么你有:

>>> 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
自定义解析
parse
可能会将某些字符串识别为日期,而您不希望将其视为日期。例如:

  • 解析
    “12”
    “1999”
    将返回一个datetime对象,该对象表示当前日期,用日期和年份替换字符串中的数字

  • “23,4”
    “23,4”
    将被解析为
    datetime.datetime(2023,4,16,0,0)

  • “Friday”
    将返回未来最近的星期五的日期
  • 类似地,
    “August”
    对应于月份更改为八月的当前日期
另外,
parse
不支持区域设置,因此不能识别英语以外语言中的月份或天数

这两个问题都可以在一定程度上通过使用自定义类来解决,自定义类定义如何识别月份和日期名称:

from dateutil.parser import parserinfo

class CustomParserInfo(parserinfo):

    # three months in Spanish for illustration
    MONTHS = [("Enero", "Enero"), ("Feb", "Febrero"), ("Marzo", "Marzo")]
然后,此类的实例可以与
parse
一起使用:

>>> parse("Enero 1990")
# ValueError: Unknown string format
>>> parse("Enero 1990", parserinfo=CustomParserInfo())
datetime.datetime(1990, 1, 27, 0, 0)

如果要解析这些特定格式,只需匹配格式列表即可:

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) 
印刷品:

"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

将所有日期标准化为单一格式会更容易。如果你接受基本上自由形式的日期,你就不能期望正确处理每一个角落的情况。此外,还有处理日期模糊性的问题。在不知道格式的情况下,如何解析像
04/06/08
这样的日期?可能是2008年6月4日,或2008年4月6日,或2004年6月8日…@tobias_k,我为没有进一步澄清而道歉;我在这个问题上增加了一些细节。解析后的日期看起来是什么并不重要,我只需要知道它是否是一个日期。“明天”是一个日期吗?“今天晚些时候”是约会吗?如果这是一个非平凡的项目,您可能需要考虑(OSX)来解析那些dates@dawg:
NSScanner
实际上只是一个lexer,而且是一个赤裸裸的lexer;它没有固有的解析能力。Python有一些类似的
re.Scanner
NSDateFormatter
是您想要引入Cocoa的最佳选择。我已经安装了该扩展。如何导入?另外,我可以使用
datetime.datetime(2023,4,16,0,0)
作为排序的布尔值,还是在if语句中?这样,如果它被解析,它就是一个日期,如果它不是,那么它就不是?嗨,扎克,要导入
parse
函数,只需使用
from dateutil.parser import parse
。我不太清楚你在第二个问题中的意思
datetime
对象的计算结果将为
True
,因此如果您愿意,您可以将它们与
if
语句一起使用。如果问题不多,您还可以帮助我跟进这个问题吗?这就是我最终要使用代码的目的。除了
日期时间
对象之外,还有什么方法可以让
.parse()
返回格式字符串吗?@JuanCarlos:谢谢你提醒我这一点。我编辑了答案,试图解决您提出的问题。