2013-07-24 4 views
8

Pythonでxlrdを使用してテキスト、数値、日付を含むファイルをインポートしたかったのですが、Python:浮動小数点からのxlrd識別日

私のような何か試してみました:

if "/" in worksheet.cell_value: 
    do_this 
else: 
    do_that 

をしかし、私は後者の日付がフロートではなく、文字列として格納され発見されたとして、それは役に立たないのでした。私がやった日時タイプに変換するには:

try: 
    get_row = str(datetime.datetime(*xlrd.xldate_as_tuple(worksheet.cell_value(i, col - 1), workbook.datemode))) 
except: 
    get_row = unicode(worksheet.cell_value(i, col - 1)) 

私は、セルにテキストが含まれている場合のための場所で例外を持っています。今では数字と日付を日付として取得したいのですが、今はすべての数値が日付に変換されるからです。

アイデア?

+0

Excelで日付と数字を区別できないと思わないでください。 – pnuts

答えて

8

まあ、気にしない、私は解決策を見つけた、ここにある!

try: 
    cell = worksheet.cell(row - 1, i) 
    if cell.ctype == xlrd.XL_CELL_DATE: 
     date = datetime.datetime(1899, 12, 30) 
     get_ = datetime.timedelta(int(worksheet.cell_value(row - 1, i))) 
     get_col2 = str(date + get_)[:10] 
     d = datetime.datetime.strptime(get_col2, '%Y-%m-%d') 
     get_col = d.strftime('%d-%m-%Y') 
    else: 
     get_col = unicode(int(worksheet.cell_value(row - 1, i))) 
except: 
    get_col = unicode(worksheet.cell_value(row - 1, i)) 

説明のビット:xlrdでは、実際にセルのタイプをチェックし、それが日付かどうかを確認できます。また、Excelは昼間を保存する奇妙な方法を持っているようだ。 (1899,12,30は正常に動作しているように見える)特定の日付が表示され、フロートから日付と時間を追加して日付を作成します。だから、私が望む日付を作成するために、私はちょうどそれらを追加し、時間(00.00.00または何か...)を取り除くために10の最初の手紙([10])だけを保った。ギリシャでは別の注文を使用しているため、私は日数/月 - 年の順序を変更しました。最後に、このコードは数値を整数に変換できるかどうかもチェックします(私のプログラムでは浮動小数点数を表示したくありません)。すべてが失敗した場合はそのままそのまま使用しますセル内の文字列...)。 私は有用だと思っていますが、これは不可能か何かと言う他のスレッドがあると思います...

+1

Windows/MacのExcelは原点に違います - これはブックのdatemode属性のためです - だからあなたはそれを使用し、datetimeをハードコーディングしないでください。また、浮動小数点から要素を切り捨てることによって(日付/時刻がExcelに格納される方法)、日付を1日オフにするのに十分な情報を削ぎ取ることも可能です(可能性は低いですが)。この問題を解決するにはどうすればいいですか?元の質問ですが、cell.ctypeチェックを追加するだけです。 –

+0

floatに含まれる時間はすべて00.00.00なので、それは何もありません...そして、なぜ私は元の質問で使用したものは扱いが難しく、たぶんバグであってもわからないので、日付の順序を変更できませんでした(それは必須です...) – Antoni4040

+0

数式が正しくありませんWindowsの場合も 'cell_value = 30'なら式が' 29-01-1900'を返し、 '30-01-1900'を返します。[Excelからの序数をどのようにして日付に変換するか? http://stackoverflow.com/q/29387137/4279)。または(より良い)[@chewynougat 'answer/comments](http://stackoverflow.com/a/18016189/4279)に示すように 'xlrd'メソッドを使用してください。また、 'date + get_'はすでにdatetimeオブジェクトです:それをstrに変換する必要はなく、datetimeに変換するだけです。それを別のフォーマットのstrに変換するだけです。'を使用して直接目的のフォーマットに変換してください。 strftime() ' – jfs

9

xlrdで利用可能なツールをさらに活用することでこれをもっと簡単にすることができると思います:

cell_type = worksheet.cell_type(row - 1, i) 
cell_value = worksheet.cell_value(row - 1, i) 

if cell_type == xlrd.XL_CELL_DATE: 
    # Returns a tuple. 
    dt_tuple = xlrd.xldate_as_tuple(cell_value, workbook.datemode) 
    # Create datetime object from this tuple. 
    get_col = datetime.datetime(
     dt_tuple[0], dt_tuple[1], dt_tuple[2], 
     dt_tuple[3], dt_tuple[4], dt_tuple[5] 
    ) 
elif cell_type == xlrd.XL_CELL_NUMBER: 
    get_col = int(cell_value) 
else: 
    get_col = unicode(cell_value) 
+6

2つのこと。 (1) '*'演算子を使ってタプルを展開することができるので、 'get_col = datetime.datetime(* dt_tuple)'です。 (2)xlrd 0.9.3より、 'xldate_as_tuple'の代わりに使用できる関数' xldate.xldate_as_datetime'があります。 (公平には、0.9.3はこの答えより新しいです。) –

関連する問題