8

我想在 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))

当单元格包含文本时,我有一个例外。现在我想将数字作为数字,将日期作为日期,因为现在所有数字都转换为日期。

有任何想法吗?

4

2 回答 2

10

我认为您可以通过更多地使用 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)
于 2013-08-02T11:48:59.453 回答
8

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

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 或其他...)。我还更改了 days_months-years 的顺序,因为在希腊我们使用不同的顺序。最后,这段代码还检查它是否可以将数字转换为整数(我不希望在我的程序中显示任何浮点数......),如果一切都失败了,它就直接使用单元格(如果有单元格中的字符串...)。

于 2013-07-25T06:50:26.320 回答