dateutil.parser使用的返回指令

时间:2018-03-09 16:18:08

标签: python python-dateutil

有没有办法找回dateutil用于解析日期的指令?

from dateutil import parser

dstr = '2017/10/01 16:44'
dtime = parser.parse(dstr)

我想要的是以某种方式获得'%Y/%m/%d %H:%M'的能力。

1 个答案:

答案 0 :(得分:3)

不,dateutil中的解析器不支持提取格式。解析器使用标记化和启发式的混合来试图弄清楚输入中的各种数字和单词可能意味着什么,并且在此过程中不会形成“格式”。

最好的办法是在输入字符串中搜索结果日期时间对象中的字段,并从中生成格式。

对于您的具体示例,这是一个合理的选项,因为所有结果值都是唯一的。如果您的输入没有唯一值,那么您将包含启发式,其中您使用多个示例来增加正确匹配的确定性。

例如,对于您的具体示例,您可以找到以'2017''10'等开头的所有日期时间组件的唯一排名,但是,对于其他示例,您将拥有搜索这些组件的字符串表示的不同变体,例如2年格式,或不使用零填充的月,日,小时或分钟组件,并且您需要考虑12小时时钟表示。

我没有直接尝试过这个,但我强烈怀疑这是一个非常适合Aho–Corasick algorithm的问题,它可以让你找到匹配已知字符串的位置(字典,这里你的各种日期时间组件格式化为输入字符串中的字符串,以及潜在的分隔符。一旦你有了这些位置,并且你已经解决了歧义,你可以从那些构造一个格式字符串。您可以通过查找诸如pm或工作日或月份名称之类的告密字符串来缩小可能的组件格式的数量。

有现成的Python实现,比如pyahocorasick package。通过该库,我可以通过几个步骤做出相当不错的近似:

>>> from dateutil import parser
>>> import ahocorasick
>>> A = ahocorasick.Automaton()
>>> dstr = '2017/10/01 16:44'
>>> dtime = parser.parse(dstr)
>>> formats = 'dmyYHIpMS'
>>> for f in formats:
...     _ = A.add_word(dtime.strftime(f'%{f}'), (False, f))
...
>>> for p in ':/ ':
...     _ = A.add_word(p, (True, p))
...
>>> A.make_automaton()
>>> for end_index, (punctuation, char) in A.iter(dstr):
...     print(end_index, char if punctuation else f'%{char}')
...
2 %d
3 %Y
3 %y
4 /
6 %m
7 /
9 %d
10
12 %H
13 :
15 %M

您可以包含优先级,并且只在达到标点符号时输出特定的格式化程序;这将在开始时解决%d / %Y / %y冲突。