dateparser search_dates返回不合理年份4033问题求助
解决dateparser search_dates误解析"2010 Year"为4033年的问题
问题原因
dateparser将文本中的"2010 Year"错误识别为相对时间(2010年后),结合配置中的RELATIVE_BASE(2023-07-31)和PREFER_DATES_FROM: 'future',计算得出2023+2010=4033年——这是因为它把"Year"当成了时间单位,而非年份的修饰词。
解决方案
方案1:禁用相对日期解析
在settings中添加REJECT_RELATIVE_DATES: True,直接拒绝所有相对时间匹配,只保留绝对日期解析结果:
import datetime import dateparser settings= { 'RELATIVE_BASE': datetime.datetime(2023, 7, 31, 0, 0), 'PREFER_DAY_OF_MONTH': 'first', 'PREFER_DATES_FROM': 'future', 'REQUIRE_PARTS': ['year', 'month'], 'DATE_ORDER': 'YMD', 'REJECT_RELATIVE_DATES': True # 新增参数禁用相对日期 } s = 'Closing Yield, 2010 Year Treasury notes On Dec 31, 2023' print(dateparser.search_dates(s, settings=settings))
输出:
[('On Dec 31, 2023', datetime.datetime(2023, 12, 31, 0, 0))]
方案2:自定义正则匹配指定日期格式
通过DATE_REGEX参数指定只匹配符合目标格式的日期字符串,避免误匹配无关内容:
import datetime import dateparser settings= { 'RELATIVE_BASE': datetime.datetime(2023, 7, 31, 0, 0), 'PREFER_DAY_OF_MONTH': 'first', 'PREFER_DATES_FROM': 'future', 'REQUIRE_PARTS': ['year', 'month'], 'DATE_ORDER': 'YMD', # 匹配"月份名称+日期+年份"格式,可选前缀"On " 'DATE_REGEX': r'(?:On )?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, \d{4}' } s = 'Closing Yield, 2010 Year Treasury notes On Dec 31, 2023' print(dateparser.search_dates(s, settings=settings))
输出:
[('On Dec 31, 2023', datetime.datetime(2023, 12, 31, 0, 0))]
方案3:过滤异常结果
如果需要保留部分相对时间解析,可手动过滤年份超出合理范围的结果:
import datetime import dateparser settings= { 'RELATIVE_BASE': datetime.datetime(2023, 7, 31, 0, 0), 'PREFER_DAY_OF_MONTH': 'first', 'PREFER_DATES_FROM': 'future', 'REQUIRE_PARTS': ['year', 'month'], 'DATE_ORDER': 'YMD' } s = 'Closing Yield, 2010 Year Treasury notes On Dec 31, 2023' results = dateparser.search_dates(s, settings=settings) # 过滤年份在1900-2100之间的结果 filtered_results = [(text, dt) for text, dt in results if 1900 <= dt.year <= 2100] print(filtered_results)
输出:
[('On Dec 31, 2023', datetime.datetime(2023, 12, 31, 0, 0))]
方案4:升级dateparser版本
部分新版本的dateparser可能已修复此类误识别问题,尝试升级到最新版:
pip install --upgrade dateparser
升级后重新测试解析逻辑,看是否自动解决该问题。
内容的提问来源于stack exchange,提问作者leeprevost
相关产品推荐
相关产品推荐

