2011-11-21 39 views
-2

我想使用xldate_as_tuple函數來將電子表格中兩個單獨的單元格的日期時間和時間值轉換爲python日期時間和時間。我打算將當前獨立的值合併爲一個Python日期時間值,以便稍後在我的代碼中使用。xlrd「年是超出範圍」的錯誤,xldate_as_tuple

我可以獲取日期行值進行轉換,但遇到時間字段有問題。我認爲它在Excel中的時間單元格的格式。

在我的情況下,電子表格中的時間字段採用以下格式: 00/01/1900 16:47或00/01/1900 17:06。我感興趣的是時間(即不是00/01/1900位)。想想看,這個日期的'00'位不是一個有效的月份,所以我認爲這就是我的問題。

思考如何最好地獲得時間價值。如果xldate_as_tuple將只是不適合我的情況,然後我應該考慮以某種方式得到的細胞作爲文本和解析它的價值工作...

乾杯

回答

0

xldate_as_tuple像宣傳的那樣,生產(年,月,一天,小時,分鐘,秒)元組。問題在於你正在用這個元組做什麼,在你的情況下,每年,每月和每天都會有0。

簡短的回答:

如果你想有一個時間值,通話datetime.time,不datetime.datetime

長答案:

打開Excel。進入單元格A1,輸入16:47:00。將其複製到B1和C1中。格式B1,自定義格式yyyy-mm-dd hh:mm:ss。你應該看到1900-01-00 16:47:00。進入單元D1型=(16+47/60)/24,然後將C1和D1格式化爲8位小數位數。您應該在C1和D1中看到0.699305556

火起來xlrd,並嘗試xlrd.xldate_as_tuple

>>> import xlrd 
>>> b = xlrd.open_workbook('xlrd_time.xls') 
>>> s = b.sheet_by_index(0) 
>>> s.row_values(0) 
[0.6993055555555556, 0.6993055555555556, 0.6993055555555556, 0.6993055555555556] 
>>> [xlrd.xldate_as_tuple(t, 0) for t in s.row_values(0)] 
[(0, 0, 0, 16, 47, 0), (0, 0, 0, 16, 47, 0), (0, 0, 0, 16, 47, 0), (0, 0, 0, 16, 47, 0)] 
>>> 

讓您的幾分之一個天爲datetime模塊境內:您的數據是一個時間的日或持續時間(「timedelta」 ),所以:

>>> import datetime 
>>> t = (16 + 47/60.)/24 
>>> t 
0.6993055555555556 
>>> datetime.timedelta(days=t) 
datetime.timedelta(0, 60420) 
>>> x = xlrd.xldate_as_tuple(t, 0) 
>>> x 
(0, 0, 0, 16, 47, 0) 
>>> datetime.time(*x[3:]) 
datetime.time(16, 47) 

您的數據不是「日期時間」;試圖做一個日期時間將失敗,因爲你已經發現:

>>> datetime.datetime(*x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: year is out of range