如何使用``xlrd.xldate_as_tuple()``

20 python date xlrd

我不太清楚如何使用以下功能:

xlrd.xldate_as_tuple
Run Code Online (Sandbox Code Playgroud)

对于以下数据

xldate:39274.0
xldate:39839.0
Run Code Online (Sandbox Code Playgroud)

有人可以给我一个关于数据功能使用的例子吗?

msw*_*msw 27

答曰文档:

Excel电子表格中的日期

实际上,没有这样的东西.你有什么是浮点数和虔诚的希望.Excel日期有几个问题:

(1)日期不作为单独的数据类型存储; 它们存储为浮点数,您必须依赖(a)在Excel中应用于它们的"数字格式"和/或(b)知道哪些单元格应该在其中包含日期.该模块通过检查已应用于每个数字单元格的格式来帮助(a); 如果它看起来是日期格式,则该单元格被分类为日期而不是数字.对此功能的反馈,特别是来自非英语地区的反馈,将不胜感激.

(2)Excel for Windows默认将日期存储为自1899-12-31T00:00:00以来的天数(或其中的一小部分).Excel for Macintosh使用默认开始日期1904-01-01T00:00:00.可以在每个工作簿的基础上在Excel中更改日期系统(例如:工具 - >选项 - >计算,勾选"1904日期系统"框).如果工作簿中已有日期,这当然是个坏主意.即使工作簿中没有日期,也没有充分的理由进行更改.正在使用的日期系统记录在工作簿中.从Windows传输到Macintosh(或反之亦然)的工作簿将与主机Excel一起正常工作.使用此模块的xldate_as_tuple函数转换工作簿中的数字时,必须使用Book对象的datemode属性.

参考:http://support.microsoft.com/default.aspx?scid = KB; EN- US; q180162

(3)Windows默认的基于1900的日期系统的Excel实现工作在1900年是闰年的错误前提下.它将数字60解释为1900-02-29,这不是有效日期.因此,任何小于61的数字都是模棱两可的.例:59是1900-02-28直接输入的结果,还是1900-03-01减去2天?OpenOffice.org Calc程序"纠正"了Microsoft的问题; 输入1900-02-27会导致存储数字59.保存为XLS文件,然后使用Excel打开文件 - 您将看到显示1900-02-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)
Run Code Online (Sandbox Code Playgroud)

它为您提供了一个Python日期时间py_date,您可以在使用标准日期时间模块时执行有用的操作.

我从来没有使用过xlrd,我的例子已经完全组成了,但如果有一个myfile.xls并且它在单元格F20中确实有一个日期编号,并且你对上面提到的精度不太挑剔,那么这段代码应该可行.

  • 刚刚注意到xlrd作者:“由于文档的质量使我能够写出一个“几乎”有效的示例。荣誉 (2认同)

Joh*_*hin 8

函数的文档(减去可能的异常列表):

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).
Run Code Online (Sandbox Code Playgroud)

作为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)
>>>
Run Code Online (Sandbox Code Playgroud)