Python - 识别日期时间字符串并确保其为日期时间可读格式

时间:2017-02-14 07:30:50

标签: python datetime

我有一个脚本可以读取电子邮件并从正文中提取日期时间。这是正常工作,直到它收到一封日期时间格式的电子邮件,如下所示:

06:00 Wednesday 22ndFebruary 2017

在22日和2月之间没有空间,因此当函数运行以将时间排除在体外时我得到了错误

Traceback (most recent call last):
  File "email_processing.py", line 137, in <module>
    e_start_time, e_end_time = main_dt(content)
  File "email_processing.py", line 26, in main_dt
    date = dateutil.parser.parse(re.search(pattern, data).group(0))
  File "/usr/lib/python2.7/site-packages/dateutil/parser.py", line 1168, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/usr/lib/python2.7/site-packages/dateutil/parser.py", line 559, in parse
    raise ValueError("Unknown string format")
ValueError: Unknown string format

我目前的功能如下,任何人都可以想到验证它的方法/确保有空间需要吗?鉴于字符串中的任何地方都可能存在空格问题,并且随着更多电子邮件的进入,日期会明显改变?

由于

def main_dt(data):
    dates = []
    for pattern in ['(?<=Start Time & Date: ).*', '(?<=Completion Time & Date: ).*']:
        try:
            date = dateutil.parser.parse(re.search(pattern, data).group(0))
        except:
            print re.search(pattern, data).group(0)
        dates.append(date)
    return dates

样本体:

Dear Customer,

(Call Transferred) We are writing to inform you of planned engineering work taking place which could impact your service.

The affected site is :  XXXXXX

Maintenance window:

Start Time & Date: 01:00 Wednesday 22nd February 2017               
Completion Time & Date: 06:00 Wednesday 22ndFebruary 2017                

Details of Work:
...

1 个答案:

答案 0 :(得分:1)

这更多是正则表达式问题。

您要捕获异常的部分,请确保使用以下方法重新格式化不正确的数据:

    validation_pattern = '(.*\\d+[a-z]{2})([A-Z].*)'
    try:
        date = dateutil.parser.parse(re.search(pattern, data).group(0))
    except:
        dirty_data_group = re.search(pattern, data).group(0)
        tidy_data_group = re.sub(validation_pattern, r'\1 \2', dirty_data_group)
        date = dateutil.parser.parse(tidy_data_group)

这应该每次在数组中得到正确的日期。但是,这仅限于您所指的具体问题,即月份与月份之间没有空格。