2012-12-04 61 views
0

當我偶然發現以下問題時,我試圖將多張Excel工作簿讀入SPSS:當我用xlrd將Excel中的日期變量讀入Python時,它似乎在日期中添加了2天。或者,也許我從Excel格式轉換爲更人性化的表示方式是不正確的。有人能告訴我下面的代碼有什麼問題嗎?xlrd是否從Excel正確檢索日期變量?

import xlwt,datetime 
wb=xlwt.Workbook() 
ws=wb.add_sheet("date_1") 
fmt = xlwt.easyxf(num_format_str='M/D/YY') 
ws.write(0,0,datetime.datetime.now(),fmt) 
wb.save(r"d:\temp\datetest.xls") 

#Now open Excel file manually -> date is correct 

import xlrd 
wb=xlrd.open_workbook(r"d:\temp\datetest.xls") 
ws=wb.sheets()[0] 
Data = ws.row_values(0)[0] 
print datetime.datetime(1900,1,1,0,0,0)+datetime.timedelta(days=Data) 

#Now date is 2 days off 

回答

1

我敢肯定,xlrd能夠告訴當電池在Excel的格式設置爲一個日期,並轉換到Python date對象自身。雖然這不是萬無一失的。

您的問題可能是由與datetime.datetime(1900,1,1,0,0,0)開始並添加timedelta它 - 你可能會想嘗試:

datetime.date(1899,12,31) + datetime.timedelta(days=Data) 

哪些應該避免(一)有一天,你會通過從1開始增加/ 1/1900和(b)有一天,你添加(我猜測),因爲它是一個datetime的對象,而不是date,這可能會推到第二天。雖然這只是一個猜測。

或者,如果您已經知道它始終持續兩天,爲什麼不這樣做?

print datetime.datetime(1900,1,1,0,0,0) + datetime.timedelta(days=Data - 2) 
1

都能跟得上。這裏有兩件事情。

1 - 在Excel中,「1」而不是「0」對應於1900年1月1日 2 - Excel包括1900年2月29日(從未發生過),佔第二天的差額。這是出於向下兼容性的原因而進行的。

考慮到這兩點似乎解決了所有問題。

1

較早的答案只是部分正確。

額外的信息:

有兩個Excel日期系統:(1900(Windows)和1904(蘋果機))。

1900系統:最早的非模糊日期時間是1900-03-01T00:00:00,表示爲61.0。

1904系統:最早的非模糊日期時間是1904-01-02T00:00:00,表示爲1.0。

哪個日期系統有效可用於xlrd從Book.datemode

xlrd提供了一個函數xldate_as_tuple,它負責處理上述所有操作。此代碼:

print datum 
print datetime.datetime(1900, 1, 1) + datetime.timedelta(days=datum) 
print datetime.datetime(1900, 3, 1) + datetime.timedelta(days=datum - 61) 
tup = xlrd.xldate_as_tuple(datum, wb.datemode) 
print tup 
print datetime.datetime(*tup) 

生產:

41274.4703588 
2013-01-02 11:17:19 
2012-12-31 11:17:19 
(2012, 12, 31, 11, 17, 19) 
2012-12-31 11:17:19 

當wb.datemode爲0(1900)。

此信息全部包含在與xlrd一起發佈的文檔中。

相關問題