-1

我正在尝试使用该xldate_as_tuple函数将电子表格中两个单独单元格中的日期时间和时间值转换为 python 日期时间和时间。我打算将当前单独的值组合成一个 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

长答案:

打开 Excel。在单元格 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.699305556在 C1 和 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)]
>>>

让您的一天中的一小部分进入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 回答