如何使用 dateparser 检测字符串中的日期?
How to use dateparser to detect dates in strings?
我想使用 dateparser 检测哪个单元格包含日期。我有多种不同的日期格式:Fr, 21.02.2020 // 20.02.2020 // 21.02 // 21-02-2020 // January, 21 2020 // 21-Jan-2020 // 21/02/20我相信将来还会有更多。库 dateparser 能够很好地检测到所有这些,尽管它也检测到 'PO'、'to'、'06'、'16:00' 作为日期或相对日期,这是我不想要的.我试图检查文档并关闭相对日期或查看如何更改为仅检测 "real dates"。在设置中,他们提供了不同的 PARSERS,并且可以只使用其中的一些。这些是默认的 PARSERS,程序会运行所有这些:
'timestamp': 如果输入字符串以 10 位数字开头,可以选择后跟其他数字或句点 (.),则前 10 位数字被解释为 Unix时间。
'relative-time': 解析与当前日期和时间相关的日期和时间(例如“1 天前”、“2 周内”)。
'custom-formats': 解析与 dateparser.parse() 的 date_formats 参数列表中的一种日期格式匹配的日期或DateDataParser.get_date_data.
'absolute-time': 解析以绝对形式表示的日期和时间(例如“May 4th”、“1991-05-17”)。它考虑了 DATE_ORDER 或 PREFER_LOCALE_DATE_ORDER.
等设置
'base-formats': 解析匹配以下日期格式之一的日期
我试图在我的代码中仅将其中一个与 settings={'base-formats':True})
部分一起使用,但它不起作用。此外,他们提供了以下代码片段来打开单个 PARSERS:
>>> from dateparser.settings import default_parsers
>>> parsers = [parser for parser in default_parsers if parser != 'relative-time']
>>> parse('today', settings={'PARSERS': parsers})
这里弹出错误:
ModuleNotFoundError: No module named 'dateparser.settings'
我试过pip install,不行。
Link 记录:https://dateparser.readthedocs.io/en/latest/#settings
这是我的代码:
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}
,但这并不能解决你的问题。
我只能建议利用返回的日期时间对象的小时和分钟默认为 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_PARSING:True
表示如果缺少YEAR
、DAY
或MONTH
,则返回值为None
,这会处理'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, 21.02.2020
我将区域设置更改为德国,接近尾声时我返回到您的初始区域设置。
的文档
我想使用 dateparser 检测哪个单元格包含日期。我有多种不同的日期格式:Fr, 21.02.2020 // 20.02.2020 // 21.02 // 21-02-2020 // January, 21 2020 // 21-Jan-2020 // 21/02/20我相信将来还会有更多。库 dateparser 能够很好地检测到所有这些,尽管它也检测到 'PO'、'to'、'06'、'16:00' 作为日期或相对日期,这是我不想要的.我试图检查文档并关闭相对日期或查看如何更改为仅检测 "real dates"。在设置中,他们提供了不同的 PARSERS,并且可以只使用其中的一些。这些是默认的 PARSERS,程序会运行所有这些:
'timestamp': 如果输入字符串以 10 位数字开头,可以选择后跟其他数字或句点 (.),则前 10 位数字被解释为 Unix时间。
'relative-time': 解析与当前日期和时间相关的日期和时间(例如“1 天前”、“2 周内”)。
'custom-formats': 解析与 dateparser.parse() 的 date_formats 参数列表中的一种日期格式匹配的日期或DateDataParser.get_date_data.
'absolute-time': 解析以绝对形式表示的日期和时间(例如“May 4th”、“1991-05-17”)。它考虑了 DATE_ORDER 或 PREFER_LOCALE_DATE_ORDER.
等设置'base-formats': 解析匹配以下日期格式之一的日期
我试图在我的代码中仅将其中一个与 settings={'base-formats':True})
部分一起使用,但它不起作用。此外,他们提供了以下代码片段来打开单个 PARSERS:
>>> from dateparser.settings import default_parsers
>>> parsers = [parser for parser in default_parsers if parser != 'relative-time']
>>> parse('today', settings={'PARSERS': parsers})
这里弹出错误:
ModuleNotFoundError: No module named 'dateparser.settings'
我试过pip install,不行。
Link 记录:https://dateparser.readthedocs.io/en/latest/#settings
这是我的代码:
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}
,但这并不能解决你的问题。
我只能建议利用返回的日期时间对象的小时和分钟默认为 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_PARSING:True
表示如果缺少YEAR
、DAY
或MONTH
,则返回值为None
,这会处理'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, 21.02.2020
我将区域设置更改为德国,接近尾声时我返回到您的初始区域设置。