首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python的xlrd模块查找日期最多的列

使用Python的xlrd模块查找日期最多的列
EN

Stack Overflow用户
提问于 2014-08-30 02:43:43
回答 2查看 1.5K关注 0票数 2

对于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,但没有成功。

下面是我尝试使用的一个函数的代码...

代码语言:javascript
复制
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格式)

代码语言:javascript
复制
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列的值解释为整数而不是日期时)

EN

回答 2

Stack Overflow用户

发布于 2014-08-30 04:32:37

我认为在决定它是否是日期-时间之前,您没有查看单元格的类型。

代码语言:javascript
复制
 if current_sheet.cell(row,column) == xlrd.XL_CELL_DATE:

应更改为

代码语言:javascript
复制
 if current_sheet.cell(row,column).ctype == xlrd.XL_CELL_DATE:
票数 1
EN

Stack Overflow用户

发布于 2014-08-30 06:04:09

我不得不在这里打破Stack Overflow协议,并提供一个“答案”,即使这个问题真正需要的是更尖锐的评论和编辑(或者更好的是,聊天室)。现有的评论序列已经太长了。

怀疑文件中的“日期”由于格式不正确(也就是说,它们在任何Excel意义上都不是日期)而没有被xlrd检测为日期,这种怀疑是很好的。所以问题仍然存在:它们是什么?

我们至少可以从两个角度着手:报告xlrd告诉我们的信息,或者报告Excel告诉我们的信息。(是的,我们还可以做其他事情,但老实说,xlrd是一个非常优秀的Excel阅读器,我们不应该使用其他任何东西。)

现在,我确信xlrd不会将任何单元格解释为“具有整数输出的公式”。xlrd不知道也不关心公式,而且从数据存储的角度来看,没有Excel整数这样的东西。( Excel中的每个数字都是一个浮点数。某些函数可能恰好具有与整数相等的值。但是他们的数据类型是浮点型。这包括Excel可能认为是日期的任何内容。)

那么,在Excel方面:单元格是什么样子的?屏幕截图是比CSV更好的支持文档,因为在写入CSV时会丢失大量信息(以至于将CSV重新加载到Excel中通常会得到与开始时不同的结果)。单元格的格式字符串是什么?(从Excel中,导航菜单,就像您要手动更改格式一样,选择自定义选项,它应该显示现有的格式字符串,可以是类似于0.00#,##0.00m/d/yyyy@等的内容。)

在xlrd方面,有问题的单元的ctypevalue是什么?不只是打印值,而是使用repr函数打印表示。例如,

代码语言:javascript
复制
print current_sheet.cell(row,column).ctype
print repr(current_sheet.cell(row,column).value)

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

顺便说一句,你的代码绝对不像它应该的那样简洁。有很多行根本不做任何事情。我明白了,你还是个新人,这很好。尽管如此,代码似乎确实可以处理给定的CSV数据(因为如果您将该CSV加载到Excel中,它将把看起来像日期的内容解释为日期)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25574381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档