我正在使用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)
如果日期,月份或年份不可用,我不希望在没有收到通知的情况下获得当前年,月或日,我需要为这些情况使用默认值。
答案 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
希望这有帮助。