2013-09-26 221 views
1

我正在使用Python腳本和xlrd模塊從我保存在我的計算機上的Excel文件中讀取日期。現在,我已經知道Excel將日期保存爲一個序列日期,它計算自1900年1月0日以來的天數。我一直在使用datetime函數將此數字轉換爲YYYY-MM-DD形式的日期對象。例如:在Python中使用xlrd從Excel中讀取日期時,datetime隨機變爲float

v_created      = sh.cell(r,created_col).value 
if not v_created: 
    v_created = 0 
elif not isinstance(v_created, basestring): 
    v_created = datetime.date(1900, 1, 1) + datetime.timedelta(int(v_created)-2) 
print 'Create ' 
print v_created 

這將打印輸出如下:

Create 
2013-09-26 

在另一方面,代碼應該做同樣的事情下一個塊,但把一個浮動到變量,而不是日期:

v_updated      = sh.cell(r,updated_col).value 
if not v_updated: 
    v_updated = 0 
elif not isinstance(v_updated, basestring): 
    v_upated = datetime.date(1900, 1, 1) + datetime.timedelta(int(v_updated)-2) 
print 'Updated ' 
print v_updated 

據我所知,這個代碼塊是等同於第一,但吐出以下輸出:

Updated 
41543.5895833 

我將這些值發送到Oracle數據庫。當我運行查詢,我得到以下錯誤:

Traceback (most recent call last): 
    cursor.execute(query, values) 
cx_Oracle.DatabaseError: ORA-00932: inconsistent datatypes: expected DATE got NUMBER 

爲什麼一個代碼塊輸出日期對象,而代碼的第二天塊輸出浮動?據我所知,Excel使用相同的格式選項以完全相同的方式存儲日期。

回答

2

您有一個錯字。

你寫:

v_upated = datetime.date(1900, 1, 1) + datetime.timedelta(int(v_updated)-2)

,然後打印v_updated

當我運行它,它的工作原理41543實際上是天數自1900年以來......喜歡你計算。

+0

哦,我的天......我多麼愚蠢!當然,在Python中它只會在現場聲明新的變量,所以它從不會拋出異常。 我總是假設我有最糟糕的錯誤時,它通常只是這樣的簡單的錯誤。 –

相關問題