0

次の問題に遭遇したとき、複数シートの Excel ワークブックを SPSS に読み込もうとしていました。xlrd を使用して Excel から Python に日付変数を読み込むと、日付に 2 日が追加されるようです。あるいは、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
4

3 に答える 3

1

xlrdセルがExcelで日付としてフォーマットされていることを認識し、Pythondateオブジェクトへの変換を独自に行うことができると確信しています。しかし、それは絶対確実ではありません。

あなたの問題はおそらくそれから始めてdatetime.datetime(1900,1,1,0,0,0)それに追加することによるtimedeltaものです-あなたは試してみたいかもしれません:

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

これは、(a)1900年1月1日から開始して追加する1日、および(b)追加する1日(推測)が、プッシュではdatetimeなくオブジェクトになることを回避する必要があります。date翌日まで。ただし、これは単なる推測です。

あるいは、一貫して2日であることをすでに知っている場合は、これを実行してみませんか?

print datetime.datetime(1900,1,1,0,0,0) + datetime.timedelta(days=Data - 2)
于 2012-12-04T20:26:50.947 に答える
1

いいえ。ここでは 2 つのことが行われています。

1 - Excel では、"0" ではなく "1" が 1900 年 1 月 1 日に対応します。これは下位互換性のために意図的に行われます。

この 2 点を考慮に入れると、すべての問題が解決するようです。

于 2012-12-05T12:15:13.923 に答える
1

以前の回答は部分的にしか正しくありません。

追加情報:

2 つの Excel 日付システムがあります: (1900 (Windows) と 1904 (Mac))。

1900 システム: 最も早い明確な日時は 1900-03-01T00:00:00 で、61.0 として表されます。

1904 システム: 最も早い明確な日時は 1904-01-02T00:00:00 で、1.0 として表されます。

どの日付システムが有効かは、 の xlrd で確認できますBook.datemode

xlrdxldate_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 で配布されるドキュメントに含まれています。

于 2012-12-31T00:30:23.157 に答える