什么是从"今天"或"昨天"和Python时间中抽出时间的最佳方式?

sh1*_*mer 9 python datetime parsing

Python有很好的日期解析,但是通过今天创建一个新日期并进行减法来识别日期时间的唯一方法,例如"今天下午3:20"或"昨天上午11:06"?

Van*_*ale 18

我喜欢的库很多,而且我看到越来越多的人使用的是python-dateutil,但遗憾的是它既不是它也不是其他传统的大日期时间解析器,来自Egenix的mxDateTime可以解析"明天"这个词,尽管这两个库都是拥有非常强大的"模糊"解析器.

我见过的唯一可以做到这一点的库是magicdate.例子:

>>> import magicdate
>>> magicdate.magicdate('today')
datetime.date(2009, 2, 15)
>>> magicdate.magicdate('tomorrow')
datetime.date(2009, 2, 16)
>>> magicdate.magicdate('yesterday')
datetime.date(2009, 2, 14)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这只返回datetime.date对象,因此不包含时间部分,也无法处理"今天下午3:20"的示例.

所以,你需要mxDateTime.例子:

>>> import mx.DateTime

>>> mx.DateTime.Parser.DateTimeFromString("Today 3:20 PM")
<mx.DateTime.DateTime object for '2009-02-15 15:20:00.00' at 28faa28>

>>> mx.DateTime.Parser.DateTimeFromString("Tomorrow 5:50 PM")
<mx.DateTime.DateTime object for '2009-02-15 17:50:00.00' at 2a86088>
Run Code Online (Sandbox Code Playgroud)

编辑:mxDateTime.Parser只解析这些例子中的时间,忽略单词"今天"和"明天".因此,对于这种特殊情况,您需要使用magicdate的组合来获取日期,并使用mxDateTime来获取时间.我的建议是只使用python-dateutils或mxDateTime,只接受他们可以解析的字符串格式.


编辑2:如评论中所述,它看起来python-dateutil现在可以处理模糊解析.我也发现了为Chandler开发的parsedatetime模块,它可以解决这个问题:

>>> import parsedatetime.parsedatetime as pdt
>>> import parsedatetime.parsedatetime_consts as pdc
>>> c=pdc.Constants()
>>> p=pdt.Calendar(c)
>>> p.parse('Today 3:20 PM')
((2010, 3, 12, 15, 20, 0, 4, 71, -1), 3)
>>> p.parse('Yesterday 11:06 AM')
((2010, 3, 11, 11, 6, 0, 3, 70, -1), 3)
Run Code Online (Sandbox Code Playgroud)

这里是参考当前时间:

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2010, 3, 12, 15, 23, 35, 951652)
Run Code Online (Sandbox Code Playgroud)

  • 我的建议是使用 myDateTime 提交错误;添加今天/昨天/明天应该不难吗? (2认同)
  • @Van:也许`dateutil`自你发布以来有所改进.使用dateutil版本1.4.1,`dateutil.parser.parse('明天下午5:50',模糊=真)`返回`datetime.datetime(2010,3,12,17,50)`. (2认同)
  • @unutbu:使用 dateutil 1.5,`"tomorrow"` 似乎不起作用。看看你的例子,它也不适用于 1.4.1 ...... `fuzzy` 参数只是允许跳过不可解析的部分。 (2认同)