【问题标题】:Handling the different results from parsedatetime处理来自 parsedatetime 的不同结果
【发布时间】:2010-12-21 02:13:31
【问题描述】:

在过去 15 年左右只在 Perl 中工作并且只是偶尔工作之后,我正在尝试学习 python。

我不明白如何处理来自 parsedatetime 的 Calendar.parse() 的 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() 的输出是不可预测且难以使用的。任何帮助表示赞赏。蒂亚。

【问题讨论】:

    标签: python


    【解决方案1】:

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

    来自 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 社区来说,判断库的声誉对我来说仍然很困难。 code.google.com/p/parsedatetimecode-bear.com/code/parsedatetime
      • parsedatetime 根据它解析的文本返回一个具有适当日期/时间值的元组。我编写它是为了返回时间、日期或日期时间,以便调用者只能获取文本中存在的信息 - 如果我总是返回一个日期时间项,那么我将不得不为可能不存在的项填写值.这有点奇怪,但是当我写它的时候它对我们(OSAF)有用:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2023-04-03
      • 2016-08-13
      • 2020-03-17
      • 2014-03-10
      相关资源
      最近更新 更多