猿问

使用openpyxl将浮动数值读取为timedate

我有一个Excel电子表格,该电子表格的字段包含较小的%f.2值,例如1.2、1.07、2.3等,并且由于某些原因,openpyxl正在将这些单元格读取为1900年日期。我已经看到过很多次出现此问题的时间,但是通常这些用户期望一个日期并且得到一个伪造的日期。我期望一个值,通常x <10.0,我得到大约30-40%的“不良”数据(作为timedate读取),而其他时候则作为数值读取。


我正在使用迭代器,因此我做了一个简单的ws.iter_rows()调用,一次将数据拖到一行。我试图将其“投射”到先前创建的包含数字值的变量,但这并没有多大用处。


有没有人对如何克服这个零星的问题提出建议。如果这是一个已知的错误,是否有任何已知的解决方法?


我发现,如果我将文件存储为csv,然后将其重新打开为csv,然后将其重新存储为xlsx,那么我将得到一个可以正确读取的文件。尽管这有助于调试代码,但我需要一个可以让我的客户使用的解决方案,而不必经历这些麻烦。


我认为,如果该列的格式不正确,则该列将适用于所有元素,因此间歇性地发生这种情况会造成混淆。


import openpyxl

from openpyxl import load_workbook


# Source workbook - wb


wb = load_workbook(filename = r'C:\data\TEST.xlsx' , use_iterators = True)

ws = wb.get_sheet_by_name(name ='QuoteFile ')


for row in ws.iter_rows():

        print(row[0].internal_value ,row[3].internal_value ,row[4].internal_value         ,row[5].internal_value)



print('Done')

这是我从Excel表中看到的输入


20015   2.13    1.2 08/01/11

20015   5.03    1.2 08/01/11

20015   5.03    1.2 08/01/11

20015   5.51    1.2 08/01/11

20015   8.13    1.2 08/01/11

20015   5.60    1.2 08/01/11

20015   5.03    1.2 08/01/11

20015   1.50    1.2 08/01/11

20015   1.50    1.2 08/01/11

20015   1.50    1.2 08/01/11

20015   1.50    1.2 08/01/11

20015   1.50    1.2 08/01/11

20015   1.50    1.2 08/01/11

这是我的输出,您可以看到前七个行将第二个字段指示为1900年的日期,而第8-13行则将该字段正确显示为数字字段:


20015.0 1900-01-02 03:07:12 1.2 2011-08-01 00:00:00

20015.0 1900-01-05 00:43:12 1.2 2011-08-01 00:00:00

20015.0 1900-01-05 00:43:12 1.2 2011-08-01 00:00:00

20015.0 1900-01-05 12:14:24 1.2 2011-08-01 00:00:00

20015.0 1900-01-08 03:07:12 1.2 2011-08-01 00:00:00

20015.0 1900-01-05 14:24:00 1.2 2011-08-01 00:00:00

20015.0 1900-01-05 00:43:12 1.2 2011-08-01 00:00:00

20015.0 1.5 1.2 2011-08-01 00:00:00

20015.0 1.5 1.2 2011-08-01 00:00:00

20015.0 1.5 1.2 2011-08-01 00:00:00

20015.0 1.5 1.2 2011-08-01 00:00:00

20015.0 1.5 1.2 2011-08-01 00:00:00

20015.0 1.5 1.2 2011-08-01 00:00:00

使用python 3.3和openpyxl 1.6.2


猛跑小猪
浏览 199回答 1
1回答
随时随地看视频慕课网APP

相关分类

Python
我要回答