2013-04-07 74 views
2

我使用pygtk和glade(python 2.7 32位解釋器是最近它支持)爲研究部門做一個應用程序,這需要抓住一堆數據從氣象站的csv輸出,並試圖擱置字典中的數據永久本地存儲。但是,我似乎無法爬過將日期和時間信息存儲到日期時間對象中的牆。無論有多少種不同的方法我嘗試抓取日期和時間字段(以字符串形式表示,例如:「2012年11月13日17:43」)並將其放入日期時間對象中,我也會遇到同樣令人討厭的錯誤:python CSV文件解析到日期時間,拋出時間格式錯誤

ValueError: time data '' does not match format '%m/%d/%Y %H:%M' 

現在有問題的代碼,它是當點擊了UI一個按鈕的事件:

def Bupload_clicked(self,widget): 
    #Create a file chooser window, with default buttons 
    chooser = gtk.FileChooserDialog("Open . .", None, gtk.FILE_CHOOSER_ACTION_OPEN, 
    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) 
    response = chooser.run() 

    if response == gtk.RESPONSE_OK: 
    with open(chooser.get_filename(), 'rb') as csvfile: 
     reader = csv.reader(csvfile, delimiter='\t', quoting=csv.QUOTE_NONE) 
     try: 
      for row in reader: #loop through rows of data 

       #here is the line of code in question: 
       print repr(datetime.datetime(*time.strptime(row[1], "%m/%d/%Y %H:%M") [:5])) 

       #rest of code doesn't work until this issue is fixed 

     except csv.Error as e: 
      sys.exit('file %s, line %d: %s' % (chooser.get_filename(), reader.line_num, e)) 
    chooser.destroy() 

我曾嘗試在不少不同的方式來完成這個任務,使用類似的問題在網絡上問了所有問題,包括將'/'換成' - ',將這一行代碼分成幾行,但似乎沒有解決這個問題。另外,在你認爲太困難之前的一個側面問題:strptime()的python文檔說它爲%m尋找[01,12],爲%H尋找[00,24],爲[01,31]尋找%d等,但氣象站的CSV文件留下了前導0。 (例如:「2/1/2013 0:43」)會導致錯誤?

從CSV文件中的原始數據(第5行):

1 11/13/2012 17:43 0 -0.2039 0 43.443 40.2 9.4 0 2.82 70.2 4.375 
2 11/13/2012 18:43 0 -0.2039 0 36.651 61.1 0.6 0 0 74.4 4.363 
3 11/13/2012 19:43 0 -0.1988 0 32.092 76.1 0.6 0 0.56 74.4 4.357 
4 11/13/2012 20:43 0 -0.1988 0 31.591 74.5 0.6 0 1.12 92.7 4.357 
5 11/13/2012 21:43 0 -0.1988 0 30.326 82.4 0.6 0 0 223.2 4.351 

這裏是列表的「內存」表示:

#replace the problem line of code with: print row 

['1', '11/13/2012 17:43', '0', '-0.2039', '0', '43.443', '40.2', '9.4', '0', '2.82', '70.2', '4.375'] 
['2', '11/13/2012 18:43', '0', '-0.2039', '0', '36.651', '61.1', '0.6', '0', '0', '74.4', '4.363'] 
['3', '11/13/2012 19:43', '0', '-0.1988', '0', '32.092', '76.1', '0.6', '0', '0.56', '74.4', '4.357'] 
['4', '11/13/2012 20:43', '0', '-0.1988', '0', '31.591', '74.5', '0.6', '0', '1.12', '92.7', '4.357'] 
['5', '11/13/2012 21:43', '0', '-0.1988', '0', '30.326', '82.4', '0.6', '0', '0', '223.2', '4.351'] 
+0

請顯示文件內容的示例。 – 2013-04-07 23:37:29

+0

你的代碼看起來很好,在CSV文件的某個地方稍後會出現一些問題。嘗試在處理它們之前打印行並查看哪一行拋出錯誤,或者捕獲錯誤並打印錯誤的行。 – 2013-04-07 23:48:40

+1

不是它與問題相關,但可以直接從'datetime'使用'strptime':'datetime.datetime.strptime(row [1],「%m /%d /%Y%H:%M」) '。 – 2013-04-07 23:50:16

回答

2

的問題不在於你的格式字符串。錯誤信息

ValueError: time data '' does not match format '%m/%d/%Y %H:%M' 

指示您正嘗試將空字符串轉換爲時間。換言之,對於您的文件row[1] == ''中的至少一行,您實際上正在呼叫time.strptime('', '%m/%d/%Y %H:%M')

+0

該文件有一些看不見的字符標題,我發現搞砸了第一次閱讀,我採取了itertools.islice(),並開始在第二行讀入和問題解決自己,謝謝! – Stranger 2013-04-07 23:58:55