在Python中解析未格式化的日期

时间:2015-04-16 18:46:43

标签: python python-2.7 parsing

我有一些来自不同网站的文字,我想从中提取日期。可以想象,日期的格式大不相同,如下所示:

Posted: 10/01/2014 
Published on August 1st 2014
Last modified on 5th of July 2014
Posted by Dave on 10-01-14

我想知道的是,如果有人知道Python库[或API]会对此有所帮助 - (除了例如正则表达式,这将是我的后备)。我可以相对容易地删除“摆在”部分,但让其他东西保持一致看起来并不容易。

2 个答案:

答案 0 :(得分:2)

我使用dateutil的解决方案

根据Lukas的建议,我使用了dateutil包(似乎比Arrow更灵活),使用模糊条目,它基本上忽略了不是日期的东西。

使用dateutil模糊解析的注意事项

要注意的主要事项是,如线程Trouble in parsing date using dateutil中所述,如果它无法解析日/月/年,则需要一个默认值(除非另有指定,否则为当天),并且据我所知,没有报告标志表明它采用了默认值。

这将导致“随机文本”返回今天的2015-4-16日期,这可能会导致问题。

<强>解决方案

因为我真的想知道什么时候失败,而不是用默认值填写日期,我最终运行了两次,然后看看它是否在两个实例上都采用了默认值 - 如果没有,那么我假设正确解析。

from datetime import datetime
from dateutil.parser import parse

def extract_date(text):

    date = {}
    date_1 = parse(text, fuzzy=True, default=datetime(2001, 01, 01))
    date_2 = parse(text, fuzzy=True, default=datetime(2002, 02, 02))

    if date_1.day == 1 and date_2.day ==2:
        date["day"] = "XX"
    else:
        date["day"] = date_1.day

    if date_1.month == 1 and date_2.month ==2:
        date["month"] = "XX"
    else:
        date["month"] = date_1.month    

    if date_1.year == 2001 and date_2.year ==2002:
        date["year"] = "XXXX"
    else:
        date["year"] = date_1.year  

    return(date)

print extract_date("Posted: by dave August 1st")

显然这有点拙劣(所以如果有人有一个更优雅的解决方案 - 请分享),但这正确地解析了我上面的四个例子[它假定美国格式的日期为10/01/2014而不是比英国格式],并导致在输入缺失数据时适当地返回XX。

答案 1 :(得分:0)

您可以使用Arrow库:

arrow.get('2013-05-05 12:30:45', ['MM/DD/YYYY', 'MM-DD-YYYY'])

两个参数,首先是要解析的str,然后是要尝试的格式列表。