关于python:处理parsedatetime的不同结果

Handling the different results from parsedatetime

在过去15年左右的时间里,我只在Perl中工作,偶尔也会学习Python。

我无法理解如何处理ParseDateTime中calendar.parse()的parse方法的两种不同结果。

给定此脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/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

这个示例运行:

Enter text: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)

Enter text:11/28
((2009, 11, 28, 14, 42, 55, 4, 331, 0), 1)

我不知道如何得到输出,这样我就可以一致地使用这样的结果:

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

这在输入为"11/28"的情况下不起作用,因为输出只是一个元组,而不是结构时间。

可能很简单……但对这个新手来说不是。从我的角度来看calendar.parse()的输出是不可预测的,很难使用。感谢您的帮助。Tia。


我知道这是一个老问题,但我昨天遇到了这个问题,这里的答案不完整(如果parse()返回日期时间,它将失败)。

从ParseDateTime文档:

parse()返回一个tuple(result,type),其中type指定:

1
2
3
4
   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日期时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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


使用x = time.struct_time(result[0]),你会得到一个struct_time(这样你就可以检查x.tm_monx.tm_mday),不管result[0]struct_time本身,还是仅仅是一个9元组(我从来没有听说过parsedatetime),所以我不知道它的返回类型为什么不一致,但是通过这种简单的方法,你可以消除这种不一致。