使用 dateutil.parser 转换 DDMMYYYY
Converting DDMMYYYY with dateutil.parser
我有以下字符串输入:24052017
。当我尝试这样做时:
>>>dateutil.parser.parse("24052017")
它告诉我month must be in 1..12
。
我什至尝试过:
>>>dateutil.parser.parse("24052017", firstday=True)
它给了我完全相同的结果。
似乎发生的事情是它不喜欢没有空格或分隔符的事实。它正确地读取了日期,但是当涉及到月份时它读取 0520
。至少我是这么怀疑的。
如何在不处理字符串的情况下使用 dateutil.parser
转换此特定输入?
如果您不喜欢使用 dateutil
,您可以使用 datetime.datetime.strptime
:
from datetime import datetime
print datetime.strptime("24052017", '%d%m%Y')
这个returns(在yyyy-mm-dd hh:mm:ss)
2017-05-24 00:00:00
嗯,dateutil.parser.parse
需要一些关于您尝试解析的日期格式的提示;由于缺少此类提示,它采用 YYYYMMDD 格式,因此您的输入等同于 2405-20-17
;要么重新排列您的字符串以读取 20170524
,例如像这样 dateutil.parser.parse(d[4:8]+d[2:4]+d[0:2])
,要么使用分隔符:dateutil.parser.parse("24.05.2017")
将起作用(但是,由于后者的歧义,前一种方法是首选)。
您不能在不处理字符串的情况下使用 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"]
空字符串不是其中的一部分。
dateutil
目前不支持此格式。一般来说,如果你知道你的日期格式并且它没有时区,你应该只使用 datetime.datetime.strptime
来解析你的日期,因为 dateutil.parser.parse
有相当多的开销用于尝试弄清楚你的日期是什么格式,而且,关键的是,它可能会弄错格式。
有一个针对 2.6.0
分支的拉取请求,正在讨论添加此格式,您可以找到它 here, ondateutil
's github。反对这一点的主要论点是,如果您尝试解析一系列日期,它将 12052017
解释为 "December 5, 2017",但 13052017
解释为 "May 13, 2017"。 (也就是说,你现在确实有同样的不一致,因为第一个日期将解析为 2017 年 12 月 5 日,但第二个日期将完全失败)。
如果你不知道字符串的格式,但你知道if它是一个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)
为 dateutil
提供更灵活和可扩展的解析器的计划进展缓慢,但目前还没有做太多工作。
您应该使用 中提到的 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(...)
。
我有以下字符串输入:24052017
。当我尝试这样做时:
>>>dateutil.parser.parse("24052017")
它告诉我month must be in 1..12
。
我什至尝试过:
>>>dateutil.parser.parse("24052017", firstday=True)
它给了我完全相同的结果。
似乎发生的事情是它不喜欢没有空格或分隔符的事实。它正确地读取了日期,但是当涉及到月份时它读取 0520
。至少我是这么怀疑的。
如何在不处理字符串的情况下使用 dateutil.parser
转换此特定输入?
如果您不喜欢使用 dateutil
,您可以使用 datetime.datetime.strptime
:
from datetime import datetime
print datetime.strptime("24052017", '%d%m%Y')
这个returns(在yyyy-mm-dd hh:mm:ss)
2017-05-24 00:00:00
嗯,dateutil.parser.parse
需要一些关于您尝试解析的日期格式的提示;由于缺少此类提示,它采用 YYYYMMDD 格式,因此您的输入等同于 2405-20-17
;要么重新排列您的字符串以读取 20170524
,例如像这样 dateutil.parser.parse(d[4:8]+d[2:4]+d[0:2])
,要么使用分隔符:dateutil.parser.parse("24.05.2017")
将起作用(但是,由于后者的歧义,前一种方法是首选)。
您不能在不处理字符串的情况下使用 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"]
空字符串不是其中的一部分。
dateutil
目前不支持此格式。一般来说,如果你知道你的日期格式并且它没有时区,你应该只使用 datetime.datetime.strptime
来解析你的日期,因为 dateutil.parser.parse
有相当多的开销用于尝试弄清楚你的日期是什么格式,而且,关键的是,它可能会弄错格式。
有一个针对 2.6.0
分支的拉取请求,正在讨论添加此格式,您可以找到它 here, ondateutil
's github。反对这一点的主要论点是,如果您尝试解析一系列日期,它将 12052017
解释为 "December 5, 2017",但 13052017
解释为 "May 13, 2017"。 (也就是说,你现在确实有同样的不一致,因为第一个日期将解析为 2017 年 12 月 5 日,但第二个日期将完全失败)。
如果你不知道字符串的格式,但你知道if它是一个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)
为 dateutil
提供更灵活和可扩展的解析器的计划进展缓慢,但目前还没有做太多工作。
您应该使用 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(...)
。