1

モジュールで Python スクリプトを使用してxlrd、コンピューターに保存した Excel ファイルから日付を読み取ります。ここで、Excel が日付を 1900 年 1 月 0 日からの日数をカウントするシリアル日付として保存することは既に知っています。datetimeこの関数を使用して、この数値を YYYY-MM-DD 形式の日付オブジェクトに変換しています。例えば:

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

あるコード ブロックが日付オブジェクトを出力し、次のコード ブロックが float を出力するのはなぜですか? 私が知る限り、Excel は同じ書式設定オプションを使用してまったく同じ方法で日付を保存しています。

4

1 に答える 1

2

タイプミスがあります。

あなたが書く:

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

そして印刷v_updated

実行すると動作します 41543 は実際には 1900 年からの日数です...あなたが計算したように。

于 2013-09-26T19:21:13.247 に答える