xlrd“年份超出范围”错误,xldate_as_tuple
我正在尝试使用 xldate_as_tuple 函数将电子表格中两个单独单元格的日期时间和时间值转换为 python 日期时间和时间。我打算将当前单独的值合并为一个 python 日期时间值,以便稍后在我的代码中使用。
我可以获取要转换的日期行值,但在处理时间字段时遇到问题。我认为这取决于Excel中时间单元格的格式。
在我的情况下,电子表格中的时间字段采用以下格式: 1900 年 1 月 00 日 16:47 或 1900 年 1 月 00 日 17:06。我感兴趣的是时间(即不是 00/01/1900 位)。考虑一下,日期的“00”位不是该月的有效日期,所以我认为这就是造成我的问题的原因。
思考如何最好地获得时间价值。如果 xldate_as_tuple 不适用于我的情况,那么我是否应该考虑以某种方式获取单元格中的值作为文本并解析它......
干杯
I am trying to use the xldate_as_tuple
function to covert a datetime and a time value from two seperate cells in a spreadsheet into python datetime and time. I intend to combine the currently seperate values into one python datetime value for use later in my code.
I can get the date row values to convert but having trouble with the time fields. I think its down to the format of the time cell in excel.
In my situation the time fields in the spreadsheet are in the following format:
00/01/1900 16:47, or 00/01/1900 17:06. All I am interested in is the time (i.e. not the 00/01/1900 bit). Thinking about it, the '00' bit of the date is not a valid day of the month so I think thats what is calusing my problems.
Thoughts appreciated as how best to get the time value. If thexldate_as_tuple
will just not work for my situation then should I consider somehow getting the value in the cell as text and parsing it...
Cheers
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
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
:将一天中的一小部分时间放入
datetime
模块范围内:您的数据可以是一天中的时间或持续时间(“timedelta”),因此:您的数据不是“日期时间”;正如您发现的那样,尝试创建日期时间将会失败:
xldate_as_tuple
works as advertised, producing a (year, month, day, hour, minute, second) tuple. The problem is with what you are doing with that tuple, which in your case will have 0 for each of year, month, and day.Short answer:
If you want a time value, call
datetime.time
, notdatetime.datetime
.Long answer:
Open Excel. Into cell A1, type
16:47:00
. Copy that into B1 and C1. Format B1 with custom formatyyyy-mm-dd hh:mm:ss
. You should see1900-01-00 16:47:00
. Into cell D1 type=(16+47/60)/24
, then format C1 and D1 as number with 8 decimal places. You should see0.699305556
in both C1 and D1.Fire up
xlrd
and try outxlrd.xldate_as_tuple
:Getting your fraction-of-a-day into
datetime
module territory: Your data is either a time-of-day or a duration ("timedelta"), so:Your data is not a "datetime"; attempting to make a datetime will fail as you have found out: