Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python dateutil.parser使用的返回指令_Python_Python Dateutil - Fatal编程技术网

Python dateutil.parser使用的返回指令

Python dateutil.parser使用的返回指令,python,python-dateutil,Python,Python Dateutil,是否有方法返回dateutil用于解析日期的指令 from dateutil import parser dstr = '2017/10/01 16:44' dtime = parser.parse(dstr) 我想要的是能够以某种方式返回'%Y/%m/%d%H:%m'。否,dateutil中的解析器不支持提取格式。解析器混合使用标记化和启发式来尝试找出输入中的各种数字和单词可能意味着什么,并且在这个过程中没有建立“格式” 最好的方法是在输入字符串中搜索结果datetime对象中的字段,并从

是否有方法返回dateutil用于解析日期的指令

from dateutil import parser

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

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

否,
dateutil
中的解析器不支持提取格式。解析器混合使用标记化和启发式来尝试找出输入中的各种数字和单词可能意味着什么,并且在这个过程中没有建立“格式”


最好的方法是在输入字符串中搜索结果datetime对象中的字段,并从中生成格式

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

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

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

有现成的Python实现,如。有了这个库,我可以在几个步骤中做出相当好的近似:

>>> 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
冲突。

“从结果datetime对象中搜索输入字符串中的字段并从中生成格式”-但是像
dstr='2017/10/01 1644'
@Sebastian这样的细微差别如何呢:该字符串中存在的组件仍然是唯一的<代码>日期时间(2017,10,1,16,44,0)因此,您仍然可以找到字符串
'2017'
'10'
'01'
'16'
'44'
,每个字符串都位于唯一的位置。您确实需要尝试查找12小时时钟的
'17'
(两位数年份)和
'1'
(一个月的一位数日)以及
'04'
'4'
(可能存在
'pm'
)。是的,但您无法区分输入字符串是否有
“:”
。我人生的关键question@Sebastian:为什么不呢?您有输入字符串和组件。一旦你找到了不同的日期时间部分,你也可以找到那些分隔符。我可以看到这种情况变得越来越复杂,以至于我的大脑无法处理不太理想的日期字符串。e、 g.
3/9/18 3:13pm
。您的使用案例是什么?你有一些你认为有效的格式,还有一些你认为无效的格式吗?@克里斯把一组日期字符串的一种格式匹配成一组更大的不同格式的日期串。检测较大组的格式并将较小组转换为该格式似乎比将两个组解析为datetime对象更有效