web-dev-qa-db-ja.com

`` xlrd.xldate_as_Tuple() ``の使い方

次の関数の使い方がよくわかりません。

xlrd.xldate_as_Tuple

以下のデータについて

xldate:39274.0
xldate:39839.0

データの関数の使用例を教えてください。

23
user428370

Quoth ドキュメント

Excelスプレッドシートの日付

実際には、そのようなことはありません。あなたが持っているのは浮動小数点数と敬虔な希望です。 Excelの日付にはいくつかの問題があります。

(1)日付は個別のデータ型として保存されません。それらは浮動小数点数として格納され、(a)Excelでそれらに適用される「数値形式」、および/または(b)どのセルに日付が含まれるかを知ることに依存する必要があります。このモジュールは、(a)各数値セルに適用されている形式を検査するのに役立ちます。日付形式のように見える場合、セルは数値ではなく日付として分類されます。特に英語を話さないロケールからのこの機能に関するフィードバックをいただければ幸いです。

(2)Excel for Windowsは、デフォルトで1899-12-31T00:00:00からの日数(またはその一部)として日付を保存します。 Excel for Macintoshは、デフォルトの開始日である1904-01-01T00:00:00を使用します。日付システムは、ワークブックごとにExcelで変更できます(たとえば、[ツール]-> [オプション]-> [計算]で、[1904日付システム]ボックスにチェックマークを付けます)。もちろん、ワークブックにすでに日付がある場合、これは悪い考えです。ブックに日付がない場合でも、変更する正当な理由はありません。どの日付システムが使用されているかがワークブックに記録されます。 WindowsからMacintosh(またはその逆)に転送されたブックは、HostExcelで正しく機能します。このモジュールのxldate_as_Tuple関数を使用してブックから数値を変換する場合は、Bookオブジェクトのdatemode属性を使用する必要があります。ワークブックが作成されたと思われる場所に応じて推測または判断すると、1462日でキルターがなくなるリスクがあります。

参照: http://support.Microsoft.com/default.aspx?scid=KB;EN-US;q180162

(3)Windowsのデフォルトの1900ベースの日付システムのExcel実装は、1900がうるう年であるという誤った前提で機能します。数値60は、有効な日付ではない1900-02-29を意味すると解釈されます。したがって、61未満の数値はあいまいです。例:59は1900-02-28の結果を直接入力したものですか、それとも1900-03-01から2日を引いたものですか? OpenOffice.org Calcプログラムは、Microsoftの問題を「修正」します。 1900-02-27と入力すると、番号59が格納されます。 XLSファイルとして保存し、Excelでファイルを開きます。1900-02-28が表示されます。

参照: http://support.Microsoft.com/default.aspx?scid=kb;en-us;214326

あなたがそれを考慮しない限りあなたの質問への答えは間違っている可能性が高いので、私はここで引用します。

したがって、これをコードに入れると、次のようになります。

import datetime
import xlrd

book = xlrd.open_workbook("myfile.xls")
sheet = book.sheet_by_index(0)
cell = sheet.cell(5, 19) # type, <class 'xlrd.sheet.Cell'>


if sheet.cell(5, 19).ctype == 3: # 3 means 'xldate' , 1 means 'text'
    ms_date_number = sheet.cell_value(5, 19) # Correct option 1
    ms_date_number = sheet.cell(5, 19).value # Correct option 2

    year, month, day, hour, minute, second = xlrd.xldate_as_Tuple(ms_date_number, 
        book.datemode)
    py_date = datetime.datetime(year, month, day, hour, minute, nearest_second)

これにより、標準の datetime モジュールを使用すると便利な操作を実行できるPython datetime in py_dateが得られます。

私はxlrdを使用したことがなく、私の例は完全に構成されていますが、myfile.xlsがあり、セルF20に実際に日付番号があり、上記のように精度にそれほど煩わされていない場合、これはコードは機能するはずです。

28
msw

関数のドキュメント(可能な例外のリストを除く):

xldate_as_Tuple(xldate、datemode)[#]

Convert an Excel number (presumed to represent a date, a datetime or a
time) into a Tuple suitable for feeding to datetime or mx.DateTime
constructors.

xldate
    The Excel number
datemode
    0: 1900-based, 1: 1904-based.
    WARNING: when using this function to interpret the contents of
    a workbook, you should pass in the Book.datemode attribute of that
    workbook. Whether the workbook has ever been anywhere near a Macintosh is
    irrelevant. 
Returns:
    Gregorian (year, month, day, hour, minute, nearest_second).

Xlrdの作者として、私はドキュメントをより良くする方法を知りたいと思っています。これらに答えていただけませんか:

日付に関する一般的なセクション(@mswで引用)を読みましたか?
関数の上記の特定のドキュメントを読みましたか?
ドキュメントの改善を提案できますか?
実際に次のように関数を実行してみましたか?

>>> import xlrd
>>> xlrd.xldate_as_Tuple(39274.0, 0)
(2007, 7, 11, 0, 0, 0)
>>> xlrd.xldate_as_Tuple(39274.0 - 1.0/60/60/24, 0)
(2007, 7, 10, 23, 59, 59)
>>>
10
John Machin

such :として使用します。

number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_Tuple(number, book_datemode)
2
Deniz Dogan
import datetime as dt
import xlrd

log_dir = 'C:\\Users\\'
infile = 'myfile.xls'
book = xlrd.open_workbook(log_dir+infile)
sheet1 = book.sheet_by_index(0)
date_column_idx = 1

## iterate through the sheet to locate the date columns
for rownum in range(sheet1.nrows):
    rows = sheet1.row_values(rownum)

    ## check if the cell is a date; continue otherwise
    if sheet1.cell(rownum, date_column_idx).ctype != 3 :
        continue

    install_dt_Tuple = xlrd.xldate_as_Tuple((rows[date_column_idx ]), book.datemode)

    ## the "*date_Tuple" will automatically unpack the Tuple. Thanks mfitzp :-)
    date = dt.datetime(*date_Tuple)
1
KC007

日付を自動的に変換するために使用するものは次のとおりです。

cell = sheet.cell(row, col)
value = cell.value
if cell.ctype == 3:  # xldate
    value = datetime.datetime(*xlrd.xldate_as_Tuple(value, workbook.datemode))
1
Collin Anderson