-1

xldate_as_tuple関数を使用して、スプレッドシート内の 2 つの個別のセルから日時と時刻の値を Python の日時と時刻に変換しようとしています。後でコードで使用するために、現在個別の値を 1 つの Python 日時値に結合するつもりです。

日付行の値を変換して取得できますが、時間フィールドに問題があります。Excelの時間セルの形式に問題があると思います。

私の状況では、スプレッドシートの時刻フィールドの形式は、00/01/1900 16:47 または 00/01/1900 17:06 です。私が興味を持っているのは時間だけです (つまり、00/01/1900 ビットではありません)。考えてみると、日付の「00」ビットは有効な日ではないので、それが問題を引き起こしていると思います。

時間値を取得する最善の方法として評価された考え。私の状況ではうまくいかない場合xldate_as_tupleは、セル内の値をテキストとして取得して解析することを検討する必要があります...

乾杯

4

1 に答える 1

1

xldate_as_tuple宣伝どおりに機能し、(年、月、日、時、分、秒) タプルを生成します。問題は、そのタプルで何をしているのかにあり、あなたの場合、年、月、日のそれぞれが 0 になります。

簡潔な答え:

時間値が必要な場合はdatetime.time、 ではなくを呼び出しますdatetime.datetime

長い答え:

エクセルを開きます。セル A1 に入力し16:47:00ます。それを B1 と C1 にコピーします。B1 をカスタム フォーマットでフォーマットしますyyyy-mm-dd hh:mm:ss。が表示されます1900-01-00 16:47:00。セル D1 に入力=(16+47/60)/24し、C1 と D1 を小数点以下 8 桁の数値として書式設定します。0.699305556C1 と D1 の両方に表示されるはずです。

起動xlrdして試してくださいxlrd.xldate_as_tuple

>>> import xlrd
>>> b = xlrd.open_workbook('xlrd_time.xls')
>>> s = b.sheet_by_index(0)
>>> s.row_values(0)
[0.6993055555555556, 0.6993055555555556, 0.6993055555555556, 0.6993055555555556]
>>> [xlrd.xldate_as_tuple(t, 0) for t in s.row_values(0)]
[(0, 0, 0, 16, 47, 0), (0, 0, 0, 16, 47, 0), (0, 0, 0, 16, 47, 0), (0, 0, 0, 16, 47, 0)]
>>>

1 日の一部をモジュール領域に入れるdatetime: データは時刻または期間 (「timedelta」) のいずれかなので、次のようになります。

>>> import datetime
>>> t = (16 + 47/60.) / 24
>>> t
0.6993055555555556
>>> datetime.timedelta(days=t)
datetime.timedelta(0, 60420)
>>> x = xlrd.xldate_as_tuple(t, 0)
>>> x
(0, 0, 0, 16, 47, 0)
>>> datetime.time(*x[3:])
datetime.time(16, 47)

あなたのデータは「日時」ではありません。あなたが知っているように、日時を作ろうとすると失敗します:

>>> datetime.datetime(*x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year is out of range
于 2011-11-21T20:41:43.650 に答える