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列值解释为整数而不是日期时)
答案 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中,它会将看日期的东西解释为日期)。