处理parsedatetime返回的不同结果

3

我在过去的15年中只使用Perl进行工作,偶尔尝试一下,现在我正在努力学习Python。

我无法理解如何处理Calendar.parse()方法从parsedatetime返回的两种不同类型的结果。

给定以下脚本:

#!/usr/bin/python

import parsedatetime.parsedatetime as pdt
import parsedatetime.parsedatetime_consts as pdc
import sys
import os

# create an instance of Constants class so we can override some of the defaults

c = pdc.Constants()

# create an instance of the Calendar class and pass in our Constants # object instead of letting it create a default

p = pdt.Calendar(c)

while True:
 reply = raw_input('Enter text:')
 if reply == 'stop': 
  break
 else:
  result = p.parse(reply)
  print result
  print

以下是样例运行结果:

输入文本:tomorrow
(time.struct_time(tm_year=2009, tm_mon=11, tm_mday=28, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=332, tm_isdst=-1), 1)

输入文本:11/28
((2009, 11, 28, 14, 42, 55, 4, 331, 0), 1)

我不知道如何获取输出结果,以便我可以始终像这样使用结果:

print result[0].tm_mon, result[0].tm_mday

如果输入是"11/28",那么这种方法就不适用,因为输出只是一个元组而不是struct_time结构体。

也许对于经验不足的新手来说,这很简单。但从我的角度来看,Calendar.parse()的输出是不可预测且难以使用的。任何帮助都将不胜感激。谢谢。

2个回答

17
我知道这是一个老问题,但昨天我遇到了这个问题,并且这里的答案不完整(如果parse()返回datetime,则会失败)。
从parsedatetime文档中可以看出: parse()返回一个元组(result,type),其中type指定以下之一:
   0 = not parsed at all
   1 = parsed as a date (of type struct_time)
   2 = parsed as a time (of type struct_time)
   3 = parsed as a datetime (of type datetime.datetime)

这种方法有点奇怪,也许不是最清晰的方式,但它有效且非常实用。

下面是一小段代码,可以将返回值转换为合适的Python日期时间格式:

import parsedatetime.parsedatetime as pdt

def datetimeFromString( s ):

    c = pdt.Calendar()
    result, what = c.parse( s )

    dt = None

    # what was returned (see http://code-bear.com/code/parsedatetime/docs/)
    # 0 = failed to parse
    # 1 = date (with current time, as a struct_time)
    # 2 = time (with current date, as a struct_time)
    # 3 = datetime
    if what in (1,2):
        # result is struct_time
        dt = datetime.datetime( *result[:6] )
    elif what == 3:
        # result is a datetime
        dt = result

    if dt is None:
        # Failed to parse
        raise ValueError, ("Don't understand date '"+s+"'")

    return dt

2
使用x = time.struct_time(result[0]),你将得到一个struct_time(这样你就可以检查x.tm_monx.tm_mday),无论result[0]struct_time本身还是只是一个9元组(我从未听说过parsedatetime,所以不知道它的返回类型为什么不一致,但使用这种简单方法可以抵消这种不一致性)。

谢谢。这帮我克服了难关。也许我应该问一下,parsedatetime是否是解析人类格式化日期(例如“下周二”)的首选方法。这是我找到的,但作为 Python 社区的新手,评估库的声誉对我来说仍然很困难。http://code.google.com/p/parsedatetime/ http://code-bear.com/code/parsedatetime/ - golliher
parsedatetime会返回一个元组,其中包含基于解析的文本的适当日期/时间值。我编写它以返回时间、日期或日期时间,这样调用者只会得到文本中存在的信息 - 如果我总是返回日期时间项,那么我就必须为可能不存在的项目填充值。这有点奇怪,但在我编写它时对我们(OSAF)有效 :) - bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接