【问题标题】:Handling missing values using dateutil.parser in python在 python 中使用 dateutil.parser 处理缺失值
【发布时间】:2017-03-17 05:26:01
【问题描述】:

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

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

但并非所有记录都如此,我要处理两种情况:

首先,无效值:

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)

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

【问题讨论】:

  • ? parse 这里是什么?你能解析函数定义吗
  • @saikumarm from dateutil.parser import parse

标签: python date parsing


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 2016-07-04
    • 2018-07-15
    • 2017-09-18
    • 1970-01-01
    • 2015-07-03
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多