【问题标题】:Python strptime or alternative for complex date string parsingPython strptime 或复杂日期字符串解析的替代方法
【发布时间】:2013-05-13 18:09:19
【问题描述】:

我收到了大量需要读入数据库的日期时间表示。我正在使用 Python(因为它很摇滚)。这些字符串的格式非常糟糕,不精确到秒,没有说明时区,而且小时没有前导 0。所以它们看起来更像这样:

April 29, 2013, 7:52 p.m.
April 30, 2013, 4 p.m.

您会注意到,如果在 4:00 到 4:01 之间发生某些事情,它也会减少分钟数(呃)。无论如何,尝试使用 time.strptime 解析这些,但 the docs 声明小时必须是十进制数字 [01:12](或 [01:24])。由于没有用 0 填充,我想知道是否还有其他东西可以传递给 strptime 以接受小时数而不以 0 开头;或者如果我应该尝试拆分,然后填充字符串;或使用其他构造日期时间对象的方法。

此外,strptime 似乎不接受 AM/PM 作为“A.M”。或“P.M.”,所以我也必须更正它。 . .

注意,我不能只批量处理这些字符串。我从一个外部应用程序一次一次地接收它们,该应用程序有时使用格式良好的 Unix 纪元时间戳,但偶尔使用这种格式。动态处理它们是唯一的选择。

我正在使用 Python 2.7 并导入了一些 Python 3 功能。

from __future__ import (print_function, unicode_literals)

【问题讨论】:

  • 你能做一些预处理吗?这就是它所要求的
  • 我可以在 Python 中有字符串的意义上进行预处理......所以我可以做任何我想做的操作。

标签: python parsing python-2.7 datetime


【解决方案1】:

最灵活的解析器是dateutil 包的一部分;它会吃掉你早餐的输入:

>>> from dateutil import parser
>>> parser.parse('April 29, 2013, 7:52 p.m.')
datetime.datetime(2013, 4, 29, 19, 52)
>>> parser.parse('April 30, 2013, 4 p.m.')
datetime.datetime(2013, 4, 30, 16, 0)

【讨论】:

  • 使用dateutil 的唯一问题是那里有少数人被其中的错误所困扰,并且会大声抱怨其他人在任何情况下都使用过它。 (嗯,那个,正确地与pytz 集成可能会有点痛苦。)否则,它会摇摆不定。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
相关资源
最近更新 更多