Python:xlrd从浮动中识别日期

Python:xlrd从浮动中识别日期,python,excel,date,types,xlrd,Python,Excel,Date,Types,Xlrd,我想在Python上使用xlrd导入一个包含文本、数字和日期的文件 我试过这样的方法: if "/" in worksheet.cell_value: do_this else: do_that 但这并没有用,因为我后来发现日期存储为浮点数,而不是字符串。要将它们转换为datetime类型,我执行了以下操作: try: get_row = str(datetime.datetime(*xlrd.xldate_as_tuple(worksheet.cell_value

我想在Python上使用xlrd导入一个包含文本、数字和日期的文件

我试过这样的方法:

if "/" in worksheet.cell_value:
    do_this
else:
    do_that  
但这并没有用,因为我后来发现日期存储为浮点数,而不是字符串。要将它们转换为datetime类型,我执行了以下操作:

try:
    get_row = str(datetime.datetime(*xlrd.xldate_as_tuple(worksheet.cell_value(i, col - 1), workbook.datemode)))
except:
    get_row = unicode(worksheet.cell_value(i, col - 1))
当单元格包含文本时,我有一个例外。现在我想把数字作为数字,日期作为日期,因为现在所有的数字都转换成日期


有什么想法吗?

好吧,没关系,我找到了一个解决方案,就在这里

try:
    cell = worksheet.cell(row - 1, i)
    if cell.ctype == xlrd.XL_CELL_DATE:
        date = datetime.datetime(1899, 12, 30)
        get_ = datetime.timedelta(int(worksheet.cell_value(row - 1, i)))
        get_col2 = str(date + get_)[:10]
        d = datetime.datetime.strptime(get_col2, '%Y-%m-%d')
        get_col = d.strftime('%d-%m-%Y')
    else:
        get_col = unicode(int(worksheet.cell_value(row - 1, i))) 
except:
    get_col = unicode(worksheet.cell_value(row - 1, i))
一点解释:事实证明,使用xlrd,您实际上可以检查单元格的类型,并检查它是否是日期。此外,Excel似乎有一种奇怪的方式来节省白天的时间。它将它们保存为浮动(左部分为天,右部分为小时),然后选择一个特定的日期(1899、12、30,似乎还可以),并从浮动中添加天和小时来创建日期。所以,为了创建我想要的日期,我只添加了它们,并且只保留了前10个字母([:10]),以消除时间(00.00.00或其他…)。我还改变了日、月、年的顺序,因为在希腊我们使用不同的顺序。最后,这段代码还检查它是否可以将数字转换为整数(我不希望在我的程序中显示任何浮点数…),如果所有操作都失败,它将按原样使用单元格(如果单元格中有字符串…)。
我希望你会觉得这很有用,我想还有其他的线索说这是不可能的或者其他的

我认为您可以通过更多地使用xlrd中提供的工具来简化这一过程:

cell_type = worksheet.cell_type(row - 1, i)
cell_value = worksheet.cell_value(row - 1, i)

if cell_type == xlrd.XL_CELL_DATE:
    # Returns a tuple.
    dt_tuple = xlrd.xldate_as_tuple(cell_value, workbook.datemode)
    # Create datetime object from this tuple.
    get_col = datetime.datetime(
        dt_tuple[0], dt_tuple[1], dt_tuple[2], 
        dt_tuple[3], dt_tuple[4], dt_tuple[5]
    )
elif cell_type == xlrd.XL_CELL_NUMBER:
    get_col = int(cell_value)
else:
    get_col = unicode(cell_value)

Windows/Mac上的Excel在原点上有所不同-这就是工作簿上的datemode属性的用途-因此您应该使用该属性,而不是硬编码datetime。也有可能(尽管不太可能)通过截断浮动中的元素(因为日期/时间是如何存储在Excel中的),删除足够的信息,从而将日期推迟一天。更接近于正确答案的是你原来的问题,但只要加上cell.ctype检查,你就完成了…float中包含的小时数都是00.00.00,所以没什么。。。我在原始问题中使用的内容很难处理,甚至可能有问题,我不知道为什么,所以我无法更改日期的顺序(这很重要…)Windows上的公式也不正确,例如,如果
cell_value=30
您的公式返回
29-01-1900
,那么它应该返回
30-01-1900
,请参阅。或者(更好)使用中所示的
xlrd
方法。另外,
date+get.
已经是一个datetime对象:无需将其转换为str,只需将其转换回datetime,只需将其转换为另一种格式的str——只需直接使用
.strftime()
将其转换为所需格式即可。(1) 您可以使用
*
操作符解压元组,因此
get\u col=datetime.datetime(*dt\u tuple)
。(2) 从xlrd 0.9.3开始,有一个函数,
xldate.xldate\u As\u datetime
,可以用来代替
xldate\u As\u tuple
。(公平地说,0.9.3比这个答案要新。)