Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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中将随机字符串转换为日期会引起组名的重新定义';m';_Python_String_Datetime_Parsing_Nlp - Fatal编程技术网

在python中将随机字符串转换为日期会引起组名的重新定义';m';

在python中将随机字符串转换为日期会引起组名的重新定义';m';,python,string,datetime,parsing,nlp,Python,String,Datetime,Parsing,Nlp,我一直在尝试解析一些非常旧的数据,以构造它们并将它们存储在数据库中。我有一些包含日期的随机字符串 年份:1999日期:1999年9月 日期:1996年9月 日期:1993 年份:2006日期:2006年5月15日 年份:2019年日期:2019年1月3日 年份:2019年日期:2019年2月14日 年份:2019年日期:2019年6月30日,2019年6月24日 正如你所看到的,有太多的可能性。 我已经尝试使用datetime、dateutil、dateparser和TimeHuman从中快速获

我一直在尝试解析一些非常旧的数据,以构造它们并将它们存储在数据库中。我有一些包含日期的随机字符串

年份:1999日期:1999年9月

日期:1996年9月

日期:1993

年份:2006日期:2006年5月15日

年份:2019年日期:2019年1月3日

年份:2019年日期:2019年2月14日

年份:2019年日期:2019年6月30日,2019年6月24日

正如你所看到的,有太多的可能性。 我已经尝试使用datetime、dateutil、dateparser和TimeHuman从中快速获取日期。 没有,他们都有理想的产出。 我取得的最大成功是使用dateparser

receiving_date=str(第[8]行)
尝试:
打印(接收日期)
接收日期=str(接收日期。替换(“日期”),“”)
接收日期=str(接收日期。替换(“年”)
接收日期=str(接收日期.替换(“:”,“”))
打印(接收日期)
Receiving_date=dateparser.parse(Receiving_date,date_格式=[%Y%d/%m/%Y],%Y],%Y%m/%Y''%d/%m/%Y']
打印(接收日期)
例外情况除外,如e:
打印(e)
我得到一个错误将组名'm'重新定义为组5;第2组处于第99位
关于如何进行的任何建议。我考虑阅读每个字符,看看是否有日期关键字。这听起来有点过分。一定有更好的办法吗

对于您提供的格式,这是一个非常详细的解析器。输出以[年、月、日]列表的形式给出,其中每个条目只有在日期中找到时才存在

import datetime
dates = ['YEAR:1999        DATE:09/1999',
         'DATE:09/1996',
         'DATE:1993 ',
         'YEAR:2006   DATE:15/05/06 ',
         'YEAR:2019 DATE:JANUARY 3, 2019',
         'YEAR:2019 DATE:FEB. 14, 2019 ',
         'YEAR:2019 DATE: 30/06/2019']
output = []
for date in dates:
    year = None
    # getting the year from the 'YEAR:' key.
    if 'YEAR' in date:
        year = int(date.split(' ',1)[0].replace('YEAR:','').strip())
        date = date.split(' ',1)[1].strip()
    #Some string cleaning
    date = date.replace('DATE:','')
    date = date.replace('/',' ').strip().replace(',',' ')
    date = date.split()
    if year is None:
        year = int(date[-1])
    date = date[0:-1]
    if len(date)==0:
        output.append([year])
        continue
    elif len(date)==1:
        month = int(date[0])
        output.append([year, month])
        continue
    else:
        try:
            day = int(date[0])
            month = int(date[1])
            output.append([year, month, day])
        except ValueError:
            day = int(date[1])
            #Getting month number from name
            month = datetime.datetime.strptime(date[0][0:3], '%b').month
            output.append([year, month, day])

print(output)
更新

有了dateparser,就有可能到达某个地方。对于您的输入,代码如下所示:

import dateparser
dates = ['YEAR:1999        DATE:09/1999',
         'DATE:09/1996',
         'DATE:1993 ',
         'YEAR:2006   DATE:15/05/06 ',
         'YEAR:2019 DATE:JANUARY 3, 2019',
         'YEAR:2019 DATE:FEB. 14, 2019 ',
         'YEAR:2019 DATE: 30/06/2019']

for date in dates:
    if 'YEAR' in date:
        date = date.split(' ',1)[1].strip()
    date = date.replace('DATE:','').strip()
    parsed_date = dateparser.parse(date, 
                                   date_formats=['%m/%Y', '%Y', '%d/%m/%Y', ],
                                   languages = ['en'])
    print(parsed_date)

但正如您所看到的,将添加一个月、一天和一个时间,这在输入中没有给出

首先,我会把这一年完全去掉,因为我看不到任何一个例子,它不包含在字符串的其余部分。在任何情况下,一年都是最后一年,所以我会从头开始。基于分隔符标记输入,并查找标记的数量。如果两个,第一个是月份,如果三个,你有一个额外的日期信息。``接收日期=str(接收日期.替换(“日期”),接收日期=str(接收日期.替换(“年”),接收日期=str(接收日期.替换(“:”,“”))接收日期=str(接收日期.替换(“,”))打印(接收日期)Receiving_date=dateparser.parse(Receiving_date,date_formats=['%Y%d/%m/%Y','%Y','/%Y%m/%Y'])“``我正在尝试此操作,但不确定在出现组错误时如何传递多个格式。这是将组名'm'重新定义为组5的错误;第2组是否在位置100?您最后一次进入的位置是什么<代码>年份:2019年日期:2019年6月24日,2019年6月30日这是一个条目吗?不,我的意思是,你上一个条目的输出应该是什么?是2019年6月30日还是2019年6月24日?还是应该是两个条目?还是一个范围?我不确定这是否适用于所有情况,因为上面的字符串是一个示例。我要做的是使用dateparser.parse()并创建一个预期格式列表,如%Y%d/%m或%Y/%m。在某些情况下,我让它起作用。当我使用一个字符串时。但是描述说我可以通过一个预期格式的列表,我得到了标题上的错误。我应该补充一点,我没有机会正确地测试它。我看到的问题是,dateparser的逻辑对于这个用例可能不够。你肯定需要在某个地方加入一些逻辑,所以我把它作为一个起点。我将对你的进行更多的测试。但是没有其他方法可以指定我的日期字符串可能具有的格式类型吗?像我一样?或者我应该为每种格式运行解析器?