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