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

发布于 2024-12-17 05:48:46 字数 421 浏览 0 评论 0原文

我正在尝试使用 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_tuplefunction 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_tuplewill just not work for my situation then should I consider somehow getting the value in the cell as text and parsing it...

Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

も星光 2024-12-24 05:48:46

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

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, not datetime.datetime.

Long answer:

Open Excel. Into cell A1, type 16:47:00. Copy that into B1 and C1. Format B1 with custom format yyyy-mm-dd hh:mm:ss. You should see 1900-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 see 0.699305556 in both C1 and D1.

Fire up xlrd and try out 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)]
>>>

Getting your fraction-of-a-day into datetime module territory: Your data is either a time-of-day or a duration ("timedelta"), so:

>>> 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)

Your data is not a "datetime"; attempting to make a datetime will fail as you have found out:

>>> datetime.datetime(*x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year is out of range
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文