Return 个指令被 dateutil.parser 使用

Return directives used by dateutil.parser

有没有办法取回 dateutil 用来解析日期的指令?

from dateutil import parser

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

我想要的是能够以某种方式让 '%Y/%m/%d %H:%M' 回来。

不,dateutil 中的解析器不支持提取格式。解析器结合使用标记化和启发式方法来尝试弄清楚输入中的各种数字和单词可能意味着什么,并且在此过程中不会建立 'format'。

最好的办法是在输入字符串中搜索结果日期时间对象中的字段,并根据 that.

生成格式

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

例如,对于您的特定示例,您可以找到所有以字符串形式显示的日期时间组件的唯一位置,从 '2017''10' 等开始。但是,对于其他示例,您您必须搜索这些组件的字符串表示的不同变体,例如 2 年格式,或不使用 zero-padding 的月、日、小时或分钟组件,并且您需要考虑 12 小时制的时钟表示.

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

有 ready-made 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 冲突。