我希望每次都以相同的方式解析日期。我写了一个代码,检测字符串中的日期,但它对日期的解析不同。我的日期是2020年11月3日,它混合了日期和月份:
import datefinder
import time
sample_dates = ["this is my sample date 2020.11.03 yes yes",
"this is my sample date 2020-11-03 yes yes",
"this is my sample date 2020/11/03 yes yes",
"this is my sample date 03.11.2020 yes yes",
"this is my sample date 03.11.2020 yes yes",
"this is my sample date 03/11/2020 yes yes"]
for sample in sample_dates:
matches = datefinder.find_dates(sample)
matches = list(matches)
print(matches)
print(matches[0].strftime("%Y-%m-%d"))
print()
我该怎么解决这个问题?我希望每次都以相同的方式解析日期,而不考虑字符串中的格式。你能告诉我如何做到这一点吗(我不在乎我应该使用什么库(?
正如我之前在关于提取日期的另一个问题中所说,没有可以处理每种日期/时间格式的通用日期提取。在你的情况下,日期清理需要多管齐下的方法,我在下面的例子中概述了这一点:
更新日期:2020年6月12日
我假设sample_dates中的一些日期来自您正在抓取的德语网站。所以下面的代码可以解析这些日期。
请查看dateutil.parser.parse.的参数
import datefinder
import re as regex
from datetime import datetime
import dateutil.parser as dparser
sample_dates = ["this is my sample date 2020.11.03 yes yes",
"this is my sample date 2020-11-03 yes yes",
"this is my sample date 2020/11/03 yes yes",
"this is my sample date 03.11.2020 yes yes",
"this is my sample date 03.11.2020 yes yes",
"this is my sample date 03/11/2020 yes yes"]
for sample in sample_dates:
check_year_first = regex.search(r'd{4}Wd{1,2}Wd{1,2}', sample)
if check_year_first:
date_strings = datefinder.find_dates(sample)
for date_string in date_strings:
reformatted_date = datetime.strptime(str(date_string), '%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d')
print(reformatted_date)
else:
date_strings = datefinder.find_dates(sample, source=True)
for date_string in date_strings:
reformatted_date = dparser.parse(str(date_string[1]).replace('date', ''), dayfirst=True).strftime('%Y-%m-%d')
print(reformatted_date)
我还假设这个问题中的日期是从问题的输出中生成的。使用Python从多个网页中提取日期。如果这是正确的,那么将此代码添加到我为该问题提供的其他代码中。正如我之前所说的,我的其他代码可以进行修改,以满足您的数据提取和清理要求。
import dateparser
from datetime import datetime
def reformatted_dates(date_string):
# date format 3. Nov. 2020
date_format_01 = regex.search(r'd{1,2}Wsw+Wsd{4}', date_string)
# date format 3. Dezember 2020
date_format_02 = regex.search(r'd{1,2}Wsw+sd{4}', date_string)
if date_format_01:
reformatted_date = dateparser.parse(date_string).strftime('%m.%d.%Y')
return reformatted_date
elif date_format_02:
pass
reformatted_date = dateparser.parse(date_string).strftime('%m.%d.%Y')
return reformatted_date
else:
# date format 18.11.2020
reformatted_date = datetime.strptime(date_string, '%d.%m.%Y').strftime('%m-%d-%Y')
return reformatted_date