2009-11-27 87 views
3

我試圖學習python之後,花了最近15年左右的工作只在Perl中,只有偶爾。處理來自parsedatetime的不同結果

我不明白如何從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 

而這個樣本來看:

輸入文本:明日
(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)

我無法弄清楚如何獲得輸出,這樣我可以consisently使用效果,像這樣:

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

這不會在輸入是這樣工作的「11/28」,因爲輸出僅僅是一個元組而不是struct_time。

可能是一個簡單的事情..但不是這個新手。從我的角度來看,Calendar.parse()的輸出是不可預測的,很難使用。任何幫助讚賞。蒂亞。

回答

15

我知道這是一個老問題,但我昨天遇到了這個問題,這裏的答案不完整(在parse()返回日期時間的情況下它會失敗)。

從parsedatetime文檔:

解析()返回一個元組(結果,類型),其中類型指定的一個:

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) 

這是一個有點怪異,也許不是做最清晰的方式它,但它的作品,是非常有用的。

這裏的代碼有點塊,將轉換不管它返回到正確的蟒蛇日期時間:

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我不不知道爲什麼它的返回類型不一致,但用這種簡單的方法可以消除這種不一致性)。

+0

謝謝。這讓我越過了我的障礙。 也許我應該問是否parsedatetime是解析人類格式化日期的首選方法(例如「下一個星期二」)。這是我發現的,但對於評估圖書館聲譽的Python社區來說,新手還是很難。 http://code.google.com/p/parsedatetime/ http://code-bear.com/code/parsedatetime/ – golliher 2009-11-27 20:12:10

+0

parsedatetime根據解析的文本返回一個具有適當日期/時間值的元組。我寫了它來返回一個時間,日期或日期時間,以便調用者只會獲得文本中存在的信息 - 如果我總是返回一個日期時間項目,那麼我將不得不填寫可能不存在的項目的值。 這有點奇怪,但它爲我們(OSAF)回來時,當我寫它:) – bear 2013-03-11 01:17:44

相關問題