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 |
这个示例运行:
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 |
号
使用