Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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 如何使用dateparser检测字符串中的日期?_Python_Datetime_Parsing_Feature Engineering_Dateparser - Fatal编程技术网

Python 如何使用dateparser检测字符串中的日期?

Python 如何使用dateparser检测字符串中的日期?,python,datetime,parsing,feature-engineering,dateparser,Python,Datetime,Parsing,Feature Engineering,Dateparser,我想使用dateparser来检测哪个单元格包含日期。我有很多不同的日期格式:Fr,21.02.2020//20.02.2020//21.02//21-02-2020//1月,21-2020//21-Jan-2020//21/02/20,我相信未来还会有更多。库dateparser能够很好地检测到所有这些数据,尽管它还检测到'PO'、'to'、'06'、'16:00'作为日期或相对日期,这是我不想要的。我试图检查文档并关闭相对日期,或者查看如何更改以只检测“真实日期”。在设置中,它们提供了不同的

我想使用dateparser来检测哪个单元格包含日期。我有很多不同的日期格式:Fr,21.02.2020//20.02.2020//21.02//21-02-2020//1月,21-2020//21-Jan-2020//21/02/20,我相信未来还会有更多。库dateparser能够很好地检测到所有这些数据,尽管它还检测到'PO'、'to'、'06'、'16:00'作为日期或相对日期,这是我不想要的。我试图检查文档并关闭相对日期,或者查看如何更改以只检测“真实日期”。在设置中,它们提供了不同的解析器,并且可以只使用其中的一些。这些是默认解析器,程序将通过它们运行:

'timestamp':如果输入字符串以10位数字开头,可选地后跟其他数字或句点(),则前10位数字将解释为Unix时间

“相对时间”:解析与当前日期和时间相关的日期和时间(例如,“1天前”、“2周内”)

“自定义格式”:解析与dateparser.parse()或DateDataParser.get_date_数据的date_formats参数列表中的一种日期格式相匹配的日期

“绝对时间”:解析以绝对形式表示的日期和时间(例如,“5月4日”、“1991-05-17”)。它会考虑诸如日期顺序或首选区域设置日期顺序等设置

“基本格式”:分析与下列日期格式之一匹配的日期

在我的代码中,我试图将其中的一个与部分
settings={'base-formats':True})
一起使用,但是它不起作用。此外,它们还提供了以下代码片段,供单个解析器使用:

>>> from dateparser.settings import default_parsers
>>> parsers = [parser for parser in default_parsers if parser != 'relative-time']
>>> parse('today', settings={'PARSERS': parsers})
这里会弹出错误:

ModuleNotFoundError:没有名为“dateparser.settings”的模块

我尝试了pip安装,但不起作用

链接到docu:

这是我的代码:

import dateparser

inputlist = [[' ','Supplier:',' Company Y', ' ', 'Project:','Carasco', ' '],[' ','21-Jan-2020',' ','Consultant:','James Farewell', ' ', ' '],['PO', ' Service', ' Cost Center', ' Accounting Object', ' deliver at', ' Amount', ' Unit'],['0106776','XYZ', 'Countable',' ', '16:00','6,00','h',],['Fr, 21.02.2020', '20.03.2020', ' ', ' ', ' ', ' ','6/04/20']]
print(inputlist)

outerlist=[]
for row in inputlist:
    innerlist = []
    for cell in row:
        parsecheck = dateparser.parse(cell,  languages=['en', 'de'], settings={'base-formats':True})
        if parsecheck == None:
            innerlist.append(0)
        else:
            innerlist.append(1)

    outerlist.append(innerlist)

print(outerlist)
我目前得到:

[0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 1, 1, 1], [1, 1, 0, 0, 0, 0, 1]]
期望输出:

[0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0,0, 0, 0], [1, 1, 0, 0, 0, 0, 1]]

同意根据文档更改设置不会按预期工作。从代码上看,您似乎无法获得仅限日期的对象(尽管我不是专家,可能错过了一些东西)。如果我理解正确,应该是
settings={'PARSER':'base formats'}
而不是
settings={'base-formats':True}
,但这并不能解决您的问题

我只能建议利用返回的datetime对象的小时和分钟默认为0这一事实来解决这个问题

import dateparser

outerlist=[]
for row in inputlist:
    innerlist = []
    for cell in row:
        parsecheck = None

        if dateparser.parse(cell, settings={'STRICT_PARSING':True}) != None and dateparser.parse(cell).hour == 0:
            parsecheck = dateparser.parse(cell,  languages=['en', 'de'], settings={'PARSER':'date_formats'})
        if parsecheck == None:
            innerlist.append(0)
        else:
            innerlist.append(1)

    outerlist.append(innerlist)
STRICT\u PARSING:True
表示如果缺少
中的任何一个,则返回值为
,这将处理返回有效日期时间对象的'PO'、'h'和'6,00'。检查hour属性是否为零将删除有效时间

不幸的是

for cell in row:
parsecheck = dateparser.parse(cell, languages=['en','de'], settings={'STRICT_PARSING':True, 'PARSER':'date_formats'})

    if parsecheck != None and parsecheck.hour == 0:
        innerlist.append(1)
    else:
        innerlist.append(0)
似乎不起作用,因为它将“16:00”解释为日期


编辑-您不需要导入日期时间

这是我所能做的最好的:

import dateparser
import locale

inputlist = [[' ','Supplier:',' Company Y', ' ', 'Project:','Carasco', ' '],[' ','21-Jan-2020',' ','Consultant:','James Farewell', ' ', ' '],['PO', ' Service', ' Cost Center', ' Accounting Object', ' deliver at', ' Amount', ' Unit'],['0106776','XYZ', 'Countable',' ', '16:00','6,00','h',],['Fr, 21.02.2020', '20.03.2020', ' ', ' ', ' ', ' ','6/04/20']]
print(inputlist)

customlist = ["%d.%m.%Y", "%d-%b-%Y", "%w/%m/%y", "%a, %d.%m.%Y"]

outerlist=[]
saved = locale.setlocale(locale.LC_ALL)
locale.setlocale(locale.LC_ALL, 'de_de')
for row in inputlist:
    innerlist = []
    for cell in row:
        parsecheck = dateparser.parse(cell,  languages=['en', 'de'], settings={'PARSERS':['custom-formats']}, date_formats=customlist)
        if parsecheck == None:
            innerlist.append(0)
        else:
            innerlist.append(1)
    outerlist.append(innerlist)

locale.setlocale(locale.LC_ALL, saved)
print(outerlist)
输出为:

[[0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 1]]
对于解析
Fr,2020年2月21日
我将区域设置更改为德国,接近尾声时,我返回到您的初始区域设置


该格式基于

的文档是的,我以前也尝试过
settings={'PARSER':'base formats'}
,但它也不起作用(如您所说)。对我来说,这些文件没有明确规定。
STRICT\u PARSING:True
由于年份缺失,以下内容是否不适用于21.02?这是我为什么不考虑的问题之一。谢谢你的帮助!!文档中说PARSERS是解析器名称的列表。您应该尝试
settings={'PARSERS':['base-formats']}
,但就我所见,这些基本格式与您列表中的格式不匹配。您是正确的,21.02不会用上述方法标识为日期。parse方法使用不区分标点符号(不包括“:”,它将其作为数字处理)的标记器。所以你可以给21.02作为有效日期,但是6,00,6!00和6点是同样有效的日期。好的,酷。是否有一种方法可以搜索字符串中的任何customlist项,从而忽略
Fr,21.02.2020
Fr,
,并尝试在字符串中查找
21.02.2020
?我想这就是解决方案。我想可以选择使用正则表达式而不是dateparser。%a代表什么?是今天吗?因为默认解析器将FR识别为Friday,所以我猜一定有填充(如%d)。但是我还没有找到它。文档上说:%a=作为区域设置的缩写名的工作日。星期日、星期一、星期六(美国);所以,我相信,德语版的Fr应该正常工作。