使用Python的xlrd模块查找具有大多数日期的列

时间:2014-08-29 18:43:43

标签: python excel date datetime xlrd

Python(和StackOverflow!)的新手,非常感谢任何帮助。

我尝试遍历Excel电子表格中的列,并确定哪个列包含最多的日期条目。

问题似乎与Excel电子表格中的格式有关。我的excel文件中的日期列为yyyy-mm-dd,但该模块似乎将它们解释为整数,例如2012-10-12 = 1990.同样,日期3/1/2014被解释为3除以1除以2014 = 0.00149。

到目前为止,我一直在使用Python中的xlrd模块来计算特定列中的日期数。我已尝试使用.xls和.xlsx,并且还尝试使用formatting_info = True但没有成功。

以下是我尝试使用的功能代码......

import xlrd
from xlrd import open_workbook
from xlrd import XL_CELL_DATE

def find_maturity_date_column2(file, threshold):

    wb = open_workbook(file)

    sheet_index = 0

    max_sheet_score = 0
    max_col_score = 0

    maturity_sheet_index = 0
    maturity_col_index = 0

    for a in wb.sheets():
        current_sheet = wb.sheet_by_index(sheet_index)
        sheet_score = 0
        for column in range(0,a.ncols):
            col_score = 0
            for row in range(0,a.nrows):
                if current_sheet.cell(row,column).ctype == xlrd.XL_CELL_DATE:
                    sheet_score = sheet_score + 1
                    col_score = col_score + 1
                else:
                    sheet_score = sheet_score
                    col_score = col_score

            if sheet_score >= max_sheet_score and col_score > max_col_score:
                max_col_score = col_score
                max_sheet_score = sheet_score
                maturity_sheet_index = sheet_index
                maturity_col_index = column
            else:
                max_col_score = max_col_score
                max_sheet_score = max_sheet_score
                maturity_sheet_index = maturity_sheet_index
                maturity_col_index = maturity_col_index            
        sheet_index = sheet_index + 1

    if max_col_score < threshold:
        maturity_sheet_index = "None Found"
        maturity_col_index = "None Found"
    else:
        maturity_sheet_index = maturity_sheet_index
        maturity_col_index = maturity_col_index

    return maturity_sheet_index, maturity_col_index

此代码未取得任何成功。关于如何解决这个问题的任何想法?也许除了xlrd之外还有不同的方式?

谢谢!

更新:以下是文件输入的示例...(以csv格式)

Tranche,Maturity Date,Country,Currency,Initial Spread
Term Loan B,2020-10-12,USA,USD,0.025
Term Loan B,2020-11-02,USA,USD,0.0275
Term Loan B,2020-05-22,USA,USD,0.0275

如何构建一个进程来识别column = 1是具有最大日期数的列(当模块将第1列值解释为整数而不是日期时)

2 个答案:

答案 0 :(得分:1)

我认为在决定是否是日期时间

之前,您缺少查看单元格的类型
 if current_sheet.cell(row,column) == xlrd.XL_CELL_DATE:

应改为

 if current_sheet.cell(row,column).ctype == xlrd.XL_CELL_DATE:

答案 1 :(得分:1)

我必须在这里打破Stack Overflow协议并提供一个&#34;答案&#34;即使这个问题真正需要的是更清晰的评论和编辑(或者更好的是,聊天室)。现有的评论意见已经太久了。

怀疑&#34;约会&#34;由于格式不正确(即,在任何Excel意义上它们都不是日期),文件中的日期未被xlrd检测为好日期。所以问题仍然存在:它们是什么?

我们可以从至少两个角度来解决这个问题:报告xlrd告诉我们的内容,或报告Excel告诉我们的内容。 (是的,我们可以做其他事情,但老实说,xlrd是一个非常称职的Excel读者,我们不应该使用其他任何东西。)

现在,我确定xlrd不会将任何单元格解释为&#34;具有整数输出的公式&#34;。 xlrd不了解或关心公式,从数据存储的角度来看,没有Excel整数这样的东西。 (Excel中的每个数字都是一个浮点数。有些可能碰巧有 compare 等于整数的值。但是它们的数据类型是float。这包括Excel可能认为是日期的任何内容。)

所以,在Excel方面:单元格看起来像是什么样的?屏幕截图是一个比CSV更好的支持文档,因为在写入CSV时会丢失大量信息(以便将CSV加载到Excel中往往会给出与您开始时不同的内容)。单元格的格式字符串是什么? (从Excel导航菜单,就像您要手动更改格式一样,选择自定义选项,它应显示现有的格式字符串,可以是0.00#,##0.00或{ {1}}或m/d/yyyy等。)

从xlrd方面来看,相关单元格的@ctype是什么?而不是仅打印值,使用value函数打印表示。例如,

repr

提供此信息(编辑您的问题或对此答案发表评论),也许我们会取得一些进展。

顺便说一句,您的代码绝对不是那么简洁。有很多线路根本不做任何事情。我明白了,你还是新手,那没关系。尽管如此,代码确实对已经给出的CSV数据起作用(因为如果将CSV加载到Excel中,它会将看日期的东西解释为日期)。