【问题标题】:Parse a string to a date gives a wrong date将字符串解析为日期会给出错误的日期
【发布时间】:2017-01-06 09:17:38
【问题描述】:

我正在尝试将字符串解析为这种格式的日期:%Y%m%d%H%M%S 通过此代码:

from dateutil.parser import parse as parseDate
from datetime import datetime, time, timedelta

chaine = "01/10/201604:45:00"
print chaine
date = chaine[:10] + " " + chaine[11:]
print date
date = parseDate(date,yearfirst=True)
print date
i = str(date).replace('-','')
print i
i = str(i).replace(':','')
print i
i = str(i).replace(' ','')
print i

这是我得到的输出:

01/10/201604:45:00
01/10/2016 4:45:00
2016-01-10 04:45:00
20160110 04:45:00
20160110 044500
20160110044500

在这里,我不是将 01 作为日,将 10 作为月,而是将 01 作为月,将 10 作为日,这意味着我得到了一月而不是十月。 另一方面,当我将 chaine 更改为:14/11/201615:30:00 时,我得到了正确的日期:20161114053000:月份然后日期。 我在这里错过了什么吗?

【问题讨论】:

  • @MartijnPieters:好的,谢谢。还是觉得问题中应该导入标准库中没有的东西……
  • @hiroprotagonist:我同意,重命名的功能也没有帮助。 dateutil 项目在这种解析方面非常受欢迎,这是我知道它的唯一原因。

标签: python date datetime-parsing


【解决方案1】:

您的日期不明确;它可以解释为 10 月 1 日或 1 月 10 日。

因为您输入的第一个数字 (01) 是,而不是月份,您需要将dayfirst 参数设置为True;默认设置为False,这意味着遇到的第一个数字被解释为月份:

>>> parseDate('01/10/2016 4:45:00')
datetime.datetime(2016, 1, 10, 4, 45)
>>> parseDate('01/10/2016 4:45:00', dayfirst=True)
datetime.datetime(2016, 10, 1, 4, 45)

【讨论】:

  • 但我想先获得月份
  • @Cloudgls:不,那么01 将意味着一月。在 input 中,01 首先出现。您在问题中声明此日期代表 October,因此您希望 second 数字是月份,第一个数字是日期。您是否将其与输出混淆了?
【解决方案2】:

您可以使用datetime.strptime() 来实现:

>>> from datetime import datetime
>>>
>>> datetime.strptime('01/10/201604:45:00', '%d/%m/%Y%H:%M:%S')
datetime.datetime(2016, 10, 1, 4, 45)

【讨论】:

  • 当然可以,但是dateutil.parser 是一个灵活 的解析器,可以同时处理不同的输入格式,这就是为什么经常使用它来代替datetime.strptime()(一次只能处理一种特定的输入格式)。
  • @MartijnPieters,我明白了。我认为当我们只有一种格式时,不需要安装新包 (python-dateutil) ;)
  • 不,但是由于 OP 询问了 那个特定功能,我认为他们有理由使用它。事实证明,也许他们没有。
  • @Cloudgls:我能问一下,你为什么要使用dateutil 来解决这个问题?我做了一个(显然是错误的)假设,即您需要 dateutil,因为您的输入比这一个示例更加多样化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2014-09-07
相关资源
最近更新 更多