使用dateutil.parser转换DDMMYYYY

Ren*_*ier 7 python python-dateutil

我有以下字符串输入:24052017.当我尝试做的时候:

>>>dateutil.parser.parse("24052017")
Run Code Online (Sandbox Code Playgroud)

它告诉我month must be in 1..12.

我甚至尝试过:

>>>dateutil.parser.parse("24052017", firstday=True)
Run Code Online (Sandbox Code Playgroud)

它给了我完全相同的结果.

似乎发生的事情是,它不喜欢没有空格或分隔符的事实.它正确地读取了一天,但是当它读到的那个月0520.这是我怀疑的,至少.

如何在dateutil.parser不操纵字符串的情况下使用转换此特定输入?

aso*_*uin 7

如果你对使用不是很珍贵dateutil,你可以这样做datetime.datetime.strptime:

from datetime import datetime

print datetime.strptime("24052017", '%d%m%Y')
Run Code Online (Sandbox Code Playgroud)

返回(以yyyy-mm-dd hh:mm:ss)

2017-05-24 00:00:00
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 7

目前不支持此格式dateutil.一般来说,如果您知道日期的格式并且没有时区,那么您应该只使用datetime.datetime.strptime解析日期,因为dateutil.parser.parse它会使用大量的开销来确定您的日期格式,以及,关键的是,它可能会使这种格式错误.

有一个针对2.6.0分支的拉取请求正在讨论添加这种格式,你可以在这里dateutil找到它的github.反对这一点的主要论点是,如果你试图解析一系列日期,它将被解释12052017为"2017年12月5日",但是13052017"2017年5月13日".(也就是说,你现在确实有同样的不一致,因为第一个日期将解析到2017年12月5日,但第二个日期将失败).

如果您知道字符串的格式,但是您知道如果它是一个8位数字日期,您希望它被解释为DDMMYYYY,现在您最好的办法是将该异常硬编码到您的解析器中:

from dateutil.parser import parse as duparse
from datetime import datetime

def parse(dtstr, *args, **kwargs):
    if len(dtstr) == 8 and dtstr.isnumeric():
        return datetime.strptime(dtstr, '%d%m%Y')
    else:
        return duparse(dtstr, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

为计划提供更灵活,可扩展的解析器有一些缓慢的计划工作dateutil,但目前还没有做太多工作.