【问题标题】:Why dateutil.parser does not work as expected?为什么 dateutil.parser 不能按预期工作?
【发布时间】:2014-03-21 06:40:31
【问题描述】:

我正在尝试获取一个代表 4 月 23 日datetime 实例,但如果传递的参数是 '3.4',则始终获取 3 月 4 日,设置 dayfirst=False 是没用的:

In [115]: from dateutil import parser

In [116]: parser.parse('4-23', ) #√
Out[116]: datetime.datetime(2014, 4, 23, 0, 0)

In [117]: parser.parse('4/23', ) #√
Out[117]: datetime.datetime(2014, 4, 23, 0, 0)

In [118]: parser.parse('4.23', ) #×
Out[118]: datetime.datetime(2014, 3, 4, 0, 0)

In [120]: parser.parse('4.23', dayfirst=False) #×
Out[120]: datetime.datetime(2014, 3, 4, 0, 0)

parser的bug吗?

【问题讨论】:

  • 模糊选项有效吗? parser.parse('4.23', fuzzy=True)?
  • @Salixalba 它没有
  • 我仍然得到相同的结果:dt=parser.parse("3/13/2019", dayfirst=True), dt.day=13
  • @ShaniShalgi 你怎么能有 13 个月的价值?解析器假定您犯了一个错误,您确实这样做了,传递了一个月的无效值,并尝试通过使 dayfirst 参数无效来纠正该错误。请参阅下面已编辑答案中的工作示例。
  • @Spade 当然我知道 13 是一个无效的月份,但这也是为什么我希望得到一个错误 dt=parser.parse("3/13/2019", dayfirst=True) ,与 dt=parser.parse("3/53/2019", dayfirst=True) 相同。提供更正是一回事,但当我特别要求 dayfirst 时自动更正又是另一回事。我有一个读取日期的 OCR 程序,如果它出错,读取 2019 年 3 月 13 日而不是 2019 年 3 月 8 日,我不想为我纠正这个问题。之后我必须编写一个精心设计的程序来撤消这个更正。

标签: python datetime python-dateutil


【解决方案1】:

简单的答案是,解析方法不支持点字符作为时间单位之间的分隔符,因为它用于以 ISO 格式表示的时间字符串的上下文中。

请尝试将所有点转换为斜杠(/) 或 heifens(-)

parser.parse('4.23'.replace('.','/'))

解决这个问题

编辑(针对新的 cmets):

这是一个实际的例子

解析器按如下预期工作:

>>> parser.parse('4/11/2019', dayfirst=True)
datetime.datetime(2019, 11, 4, 0, 0)
>>> parser.parse('4/11/2019', dayfirst=False)
datetime.datetime(2019, 4, 11, 0, 0)

解析器代表调用者假设错误并尝试通过使dayfirst 参数无效来自动更正问题:

>>> parser.parse('3/13/2019', dayfirst=False)
datetime.datetime(2019, 3, 13, 0, 0)
>>> parser.parse('3/13/2019', dayfirst=True)
datetime.datetime(2019, 3, 13, 0, 0)

不可能是第 13 个月,因此解析器假定调用者错误地请求了 dayfirst 参数 - 尝试通过使 dayfirst 无效而不是引发异常来解决问题。这是此解析器的另一个问题。

【讨论】:

  • 那么有没有一些文档说. 使用是非法的? parse('3.15.13') 运行良好。
  • 我知道可以使用/,只是问为什么(或何时)我们不应该使用.
  • @Spade 根据documentation 支持其他分隔符,包括.。如果不支持,模块应该无法解析,但它没有。
  • @zhangxaochen:听起来你们是对的。这是一个错误,但 parse 方法试图理解太多的东西,包括以字符串表示的时间。 s = ''' zhangxaochen found a bug with the dateutil.parser.parse method on March 21st 2014, exactly at 11:45 pm with timezone -08:00." ''' print parser.parse(s, fuzzy=True) 。你找到了它打破的方法!
  • @Spade 你为什么说你找到了它打破的方法?你展示的例子在我的机器上运行良好
猜你喜欢
  • 2021-05-30
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多