在python中使用dateutil.parser处理缺失值

时间:2017-03-17 05:26:02

标签: python date parsing

我正在使用python dateutil标准化日期格式,理想情况是我有所有日期:

from dateutil.parser import parse
date1 = '2012/01/02'
parse(date1)
datetime.datetime(2012, 1, 2, 0, 0)

但是并非所有记录的情况都是如此,我想要处理2个案例:

首先,无效值:

date2 = '2012/19/01'
parse(date2)
ValueError: month must be in 1..12

date2 = '2012/1/00'
parse(date2)
ValueError: day is out of range for month

对于那些情况,我仍然想要有任何可用的数据,对于今年的第一个例子,以及年和月的第二个例子。

第二种情况,缺少值:

date3 = '/1/10'
parse(date3)
datetime.datetime(2017, 1, 10, 0, 0)

如果日期,月份或年份不可用,我不希望在没有收到通知的情况下获得当前年,月或日,我需要为这些情况使用默认值。

1 个答案:

答案 0 :(得分:2)

也许你应该编写一个解析器方法,检查输入字符串并用默认值替换非法日期:

from datetime import datetime
default=['2017','1','1']

def paretime(t):
    i=t.split('/')
    if len(i)<3:
        return None
    y,m,d = i
    if y not in range(1,2018):
        y=default[0]
    if m not in range(1, 13):
        m=default[1]
    if d not in range(1, 32):
        d=default[2]
    return datetime.strptime("-".join([y,m,d]), '%Y-%m-%d')


print paretime('/1/1')

输出:

2017-01-01 00:00:00

default=['2017','1','1']
from datetime import datetime

def paretime(t):
    d={i:j for i,j in enumerate(t.split('/')) if i==0 and j in (1,2018) if i==1 and j in (1,13)  if i==2 and j in (1,32)}
    return datetime.strptime("-".join([d.get(0,default[0]),d.get(1,default[1]),d.get(2,default[2])]), '%Y-%m-%d')

print paretime('/41/0')

输出:

2017-01-01 00:00:00

希望这有帮助。