我正在尝试使用xldate_as_tuple
函数将电子表格中两个单独单元格的日期时间和时间值转换为python日期时间和时间。我打算将当前单独的值组合成一个python日期时间值,以便稍后在我的代码中使用。
我可以获取要转换的日期行值,但是时间字段有问题。我认为它取决于excel中时间单元格的格式。
在我的情况下,电子表格中的时间字段采用以下格式: 00/01/1900 16:47,或00/01/1900 17:06我感兴趣的是时间(即不是00/01/1900位)。考虑到这一点,日期的'00'位不是一个月的有效日期,所以我认为这是在缓解我的问题。
思考赞赏如何最好地获得时间价值。如果xldate_as_tuple
对我的情况不起作用,那么我应该考虑以某种方式将单元格中的值作为文本并解析它...
干杯
答案 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