处理parsedatetime的不同结果

3 投票
2 回答
2330 浏览
提问于 2025-04-15 16:27

我正在学习Python,之前大约15年只用过Perl,而且还是偶尔用一下。

我搞不懂如何处理来自parsedatetime库中Calendar.parse()方法的两种不同结果。

给你看这个脚本:

#!/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

还有这个示例运行结果:

输入文本:明天
(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 个回答

2

使用 x = time.struct_time(result[0]) 这行代码,你会得到一个 struct_time 对象。这样一来,不管 result[0] 是不是一个 struct_time,或者只是一个包含9个元素的元组,你都可以检查 x.tm_mon(月份)和 x.tm_mday(日期)。我对 parsedatetime 这个东西不太了解,所以不清楚它为什么返回的类型不一致,但用这个简单的方法,你可以解决这个不一致的问题。

17

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

根据parsedatetime的文档:

parse()会返回一个元组(结果,类型),其中类型指定了以下几种:

   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

撰写回答