使用dateutil.parser转换DDMMYYYY

时间:2017-06-02 13:36:10

标签: python python-dateutil

我有以下字符串输入:static func view() -> HeaderView { return Bundle.main.loadNibNamed("HeaderView", owner: nil, options: nil)![0] as! HeaderView } 。当我尝试做的时候:

24052017

它告诉我>>>dateutil.parser.parse("24052017")

我甚至尝试过:

month must be in 1..12

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

似乎发生的事情是,它不喜欢没有空格或分隔符的事实。它正确地读取了这一天,但是当它读到>>>dateutil.parser.parse("24052017", firstday=True) 的月份时。这是我怀疑的,至少。

如何使用0520转换此特定输入,而不操作字符串?

6 个答案:

答案 0 :(得分:7)

如果您对使用quantile并不重要,可以使用dateutil执行此操作:

datetime.datetime.strptime

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

from datetime import datetime

print datetime.strptime("24052017", '%d%m%Y')

答案 1 :(得分:7)

dateutil目前不支持此格式。一般情况下,如果您知道日期的格式并且没有时区,则应该使用datetime.datetime.strptime来解析日期,因为dateutil.parser.parse有相当大的开销,它会尝试使用弄清楚你的日期是什么格式,而且,关键的是,它可能会使这种格式错误。

针对2.6.0分支的拉取请求正在讨论中添加此格式,您可以找到它here, ondateutil's github。反对这一点的主要论点是,如果您尝试解析一系列日期,它会将12052017解释为“2017年12月5日”,但将13052017解释为“2017年5月13日”。 (也就是说,你现在确实有同样的不一致,因为第一个日期将解析到2017年12月5日,但第二个日期将会失败)。

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

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) 提供更灵活,可扩展的解析器有一些缓慢的计划工作,但目前还没有做太多工作。

答案 2 :(得分:1)

好吧,dateutil.parser.parse需要一些关于你试图解析的日期格式的提示;在缺少此类提示时,它采用YYYYMMDD格式,因此您的输入等同于2405-20-17;要么重新排列字符串以阅读20170524或使用分隔符:dateutil.parser.parse("24.05.2017")将起作用。

答案 3 :(得分:1)

您应该使用asongtoruin' answer中提到的datetime库。但是,如果您想使用dateutil.parser实现此目的,则必须先将字符串转换为dateutil可理解的格式。以下是示例:

>>> d_string = "24052017"

#                                                    to consider day before month v
>>> dateutil.parser.parse('/'.join([d_string[:2], d_string[2:4],d_string[4:]]), dayfirst=True)
datetime.datetime(2017, 5, 24, 0, 0)

此处我将"24052017"转换为"24/05/2017",然后再将其转移到dateutil.parser.parse(...)

答案 4 :(得分:1)

如果您坚持使用dateutil.parser.parse,我建议采用这种方式:

d = '24052017'
dateutil.parser.parse(d[4:8]+d[2:4]+d[0:2])

答案 5 :(得分:-1)

您无法在不操纵字符串的情况下使用 dateutil.parser.parse

import dateutil.parser

parserinfo = dateutil.parser.parserinfo(dayfirst=True, yearfirst=False)
print dateutil.parser.parse("24052017", parserinfo)

> Traceback (most recent call last):
> File "python", line 4, in <module>
> ValueError: month must be in 1..12

http://dateutil.readthedocs.io/en/stable/parser.html#dateutil.parser.parserinfo

在parserinfo中,JUMP是一个分隔符数组。

# m from a.m/p.m, t from ISO T separator
JUMP = [" ", ".", ",", ";", "-", "/", "'",
        "at", "on", "and", "ad", "m", "t", "of",
        "st", "nd", "rd", "th"]

字符串不属于它。