xlrd“年份超出范围”错误,xldate_as_tuple

时间:2011-11-21 11:01:46

标签: python xlrd

我正在尝试使用xldate_as_tuple函数将电子表格中两个单独单元格的日期时间和时间值转换为python日期时间和时间。我打算将当前单独的值组合成一个python日期时间值,以便稍后在我的代码中使用。

我可以获取要转换的日期行值,但是时间字段有问题。我认为它取决于excel中时间单元格的格式。

在我的情况下,电子表格中的时间字段采用以下格式: 00/01/1900 16:47,或00/01/1900 17:06我感兴趣的是时间(即不是00/01/1900位)。考虑到这一点,日期的'00'位不是一个月的有效日期,所以我认为这是在缓解我的问题。

思考赞赏如何最好地获得时间价值。如果xldate_as_tuple对我的情况不起作用,那么我应该考虑以某种方式将单元格中的值作为文本并解析它...

干杯

1 个答案:

答案 0 :(得分:0)

xldate_as_tuple按宣传方式工作,产生(年,月,日,时,分,秒)元组。问题在于您使用该元组所做的事情,在您的情况下,每年,每月和每天都会为0。

简短回答:

如果您想要时间值,请拨打datetime.time,而不是datetime.datetime

答案很长:

打开Excel。进入单元格A1,键入16:47:00。将其复制到B1和C1中。使用自定义格式yyyy-mm-dd hh:mm:ss格式化B1。你应该看到1900-01-00 16:47:00。进入单元格D1类型=(16+47/60)/24,然后将C1和D1格式化为8位小数的数字。您应该在C1和D1中看到0.699305556

启动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