如何使用 ``xlrd.xldate_as_tuple()``
我不太确定怎么使用下面这个函数:
xlrd.xldate_as_tuple
对于以下数据
xldate:39274.0
xldate:39839.0
能不能给我一个关于如何在这些数据上使用这个函数的例子呢?
5 个回答
用它像这样使用:
number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_tuple(number, book_datemode)
这个函数的文档内容(不包括可能出现的错误列表):
xldate_as_tuple(xldate, datemode) [#]
Convert an Excel number (presumed to represent a date, a datetime or a time) into a tuple suitable for feeding to datetime or mx.DateTime constructors. xldate The Excel number datemode 0: 1900-based, 1: 1904-based. WARNING: when using this function to interpret the contents of a workbook, you should pass in the Book.datemode attribute of that workbook. Whether the workbook has ever been anywhere near a Macintosh is irrelevant. Returns: Gregorian (year, month, day, hour, minute, nearest_second).
作为xlrd的作者,我想知道如何能让文档变得更好。你能帮我回答以下问题吗:
你有看过关于日期的一般说明吗(@msw引用的)?
你有看过上面这个函数的具体文档吗?
你能提出一些文档改进的建议吗?
你有没有尝试过像这样运行这个函数:
>>> import xlrd
>>> xlrd.xldate_as_tuple(39274.0, 0)
(2007, 7, 11, 0, 0, 0)
>>> xlrd.xldate_as_tuple(39274.0 - 1.0/60/60/24, 0)
(2007, 7, 10, 23, 59, 59)
>>>
根据文档的说法:
Excel 表格中的日期
实际上,Excel 中并没有真正的日期。你看到的只是浮点数和一些美好的希望。关于 Excel 日期,有几个问题:
(1) 日期并不是作为一种单独的数据类型存储的;它们是以浮点数的形式存储的。你需要依赖于 (a) Excel 中应用的“数字格式”,或者 (b) 知道哪些单元格应该包含日期。这个模块通过检查每个数字单元格的格式来帮助解决 (a) 的问题;如果它看起来像是日期格式,那么这个单元格就会被分类为日期,而不是数字。我们很希望能收到来自非英语国家用户的反馈。
(2) Windows 版的 Excel 默认将日期存储为自 1899年12月31日以来的天数(或其小数部分)。而 Mac 版的 Excel 则使用 1904年1月1日作为默认起始日期。你可以在 Excel 中按工作簿来更改日期系统(例如:工具 -> 选项 -> 计算,勾选“1904 日期系统”框)。当然,如果工作簿中已经有日期,这样做是个坏主意。即使工作簿中没有日期,也没有理由去更改它。使用哪个日期系统会记录在工作簿中。从 Windows 转到 Mac(或反之)的工作簿在目标 Excel 中会正常工作。当使用这个模块的 xldate_as_tuple 函数来转换工作簿中的数字时,你必须使用 Book 对象的 datemode 属性。如果你随便猜测,或者根据你认为工作簿创建的地方来判断,你可能会出现日期偏差,最多会有 1462 天的误差。
参考资料: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q180162
(3) Excel 对于基于 1900 年的日期系统的实现是错误的,它错误地认为 1900 年是一个闰年。它把数字 60 解释为 1900年2月29日,但这并不是一个有效的日期。因此,任何小于 61 的数字都是模糊的。例如:59 是直接输入的 1900年2月28日,还是 1900年3月1日减去 2 天?OpenOffice.org Calc 程序“纠正”了 Microsoft 的问题;输入 1900年2月27日会存储数字 59。将其保存为 XLS 文件,然后用 Excel 打开,你会看到显示的是 1900年2月28日。
参考资料: http://support.microsoft.com/default.aspx?scid=kb;en-us;214326
我引用这些内容是因为,如果不考虑这些因素,你的问题的答案很可能是错误的。
所以把这些内容放到代码中大概是这样的:
import datetime
import xlrd
book = xlrd.open_workbook("myfile.xls")
sheet = book.sheet_by_index(0)
cell = sheet.cell(5, 19) # type, <class 'xlrd.sheet.Cell'>
if sheet.cell(5, 19).ctype == 3: # 3 means 'xldate' , 1 means 'text'
ms_date_number = sheet.cell_value(5, 19) # Correct option 1
ms_date_number = sheet.cell(5, 19).value # Correct option 2
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(ms_date_number,
book.datemode)
py_date = datetime.datetime(year, month, day, hour, minute, nearest_second)
这段代码会给你一个 Python 的 datetime 对象,存储在 py_date
中,你可以使用标准的 datetime 模块对其进行有用的操作。
我从来没有使用过 xlrd,我的例子完全是虚构的,但如果有一个 myfile.xls
文件,并且它在 F20 单元格中确实有一个日期数字,而你对精度没有太多要求,那么这段代码应该可以工作。