26

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

xlrd.xldate_as_tuple

以下のデータについて

xldate:39274.0
xldate:39839.0

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

4

5 に答える 5

33

ドキュメントを引用してください:

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(またはその逆)に転送されたブックは、ホストExcelで正しく機能します。このモジュールのxldate_as_tuple関数を使用してブックから数値を変換する場合は、Bookオブジェクトのdatemode属性を使用する必要があります。

参照: 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)

これにより、標準の日時モジュールpy_dateを使用して便利な操作を実行できるという点で、Pythonの日時が提供されます。

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

于 2010-09-16T15:25:21.970 に答える
11

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

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)
>>>
于 2010-09-21T03:14:45.883 に答える
2

そのようにそれを使用してください:

number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_tuple(number, book_datemode)
于 2010-09-16T15:08:06.350 に答える
2
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)
于 2016-01-26T20:21:01.433 に答える
2

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

cell = sheet.cell(row, col)
value = cell.value
if cell.ctype == 3:  # xldate
    value = datetime.datetime(*xlrd.xldate_as_tuple(value, workbook.datemode))
于 2017-09-13T19:25:50.380 に答える