Python有很好的日期解析但是通过今天创建一个新日期并进行减法来识别日期时间的唯一方法,例如“今天下午3:20”或“昨天上午11:06”?
答案 0 :(得分:18)
我非常喜欢的图书馆,我看到越来越多人使用,python-dateutil但不幸的是,它和其他传统的大日期解析器mxDateTime from Egenix都无法解析这个词“明天“尽管两个图书馆都有非常强大的”模糊“解析器。
我见过的唯一可以执行此操作的库是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)
不幸的是,这只会返回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>
编辑:mxDateTime.Parser仅解析这些示例中的时间并忽略单词“today”和“tomorrow”。因此,对于这种特殊情况,您需要使用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)
这里是参考当前时间:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2010, 3, 12, 15, 23, 35, 951652)
答案 1 :(得分:-2)
我还没有完全掌握Python的速度,但你的问题让我感兴趣,所以我挖了一下。
使用timedelta
进行日期减法是我找到的最常见的解决方案。
由于您的问题是否是唯一方式,我检查了strftime格式代码,看看您是否可以定义自己的格式代码。不幸的是。来自Python的strftime documentation:
...支持的全套格式代码因平台而异,因为Python调用平台C库的strftime()函数,平台变体很常见。
以下是C标准(1989版)要求的所有格式代码列表......
无论如何,这不是一个确定的答案,但也许它会让别人有时间咆哮错误的树。