当前位置: 首页 > 知识库问答 >
问题:

openpyxl:从Excel中丢失精度读取浮动?

公冶阳德
2023-03-14

我正在使用OS X,我的Excel工作簿中有一些数据,格式为数字(这里是指向Excel中数据的Dropbox链接)

现在,我正尝试使用openpyxl在Python中导入它们:

from openpyxl import load_workbook

# opening the file .xlsx
file_dir = './data'
file_xlsx = file_dir + '/db_StocksHighFreq.xlsx'

# with openpyxl
wb1 = load_workbook(file_xlsx)
IBM_wb1 = wb1.sheet_by_name('IBM')

# "Time" time series
Time = wb1['IBM'].columns[0][1:]

# "Price" time series
Price = wb1['IBM'].columns[1][1:]

输出:

1) “时间”正确解读为日期时间。时间对象

In [23]: Time[0].value
Out[23]: datetime.time(9, 30)

In [24]: type(Time[0].value)
Out[24]: datetime.time

2) 但“价格”时间序列,读作浮动,似乎被截断。。。

In [25]: Price[0].value
Out[25]: 205.85

In [26]: type(Price[0].value)
Out[26]: float

In [27]: Price[17].value
Out[27]: 206.18

In [28]: Price[17].value < 206.18
Out[28]: False

而不是206.1799,这也是Excel(单元格B19)中的显示方式。

有解决办法吗?谢谢你的关注。

共有2个答案

唐弘益
2023-03-14

加布里埃尔,

语法表_by_name对我不起作用,所以我认为它在2.3中一定过时了。1.您的代码在我使用时有效:

IBM_wb1 = wb1.get_sheet_by_name('IBM')

您可以使用更新openpyxl版本

pip install openpyxl --upgrade

在完成其余代码后,我没有遇到任何问题,能够输出206.1799。

冯育
2023-03-14

不使用熊猫的任何原因?

import pandas as pd

df = pd.read_excel('db_StocksHighFreq.xlsx')
print df.head()
>>       Time  Price 20 Sep 2012  Price 21 Sep 2012
0    09:30:00           205.8500           207.3600
1    09:31:00           205.3900           207.0600
2    09:32:00           206.3600           207.0000
3    09:33:00           206.0100           207.2000
4    09:34:00           206.5000           207.4700
5    09:35:00           206.5650           207.2400
6    09:36:00           206.6100           207.3400
7    09:37:00           206.8500           207.3900
8    09:38:00           206.9200           207.4300
9    09:39:00           206.9100           207.4000
10   09:40:00           206.9500           207.4200
11   09:41:00           206.6500           207.2800
12   09:42:00           206.4400           207.1000
13   09:43:00           206.3300           207.0600
14   09:44:00           206.3100           206.9600
15   09:45:00           206.2300           206.9200
16   09:46:00           206.3000           207.1300
17   09:47:00           206.1799           206.9700
18   09:48:00           206.0240           206.9000
19   09:49:00           206.0900           206.9900
.
.
.


print df['Price 20 Sep 2012'].dtype
>> float64
 类似资料:
  • 本文向大家介绍C++中double浮点数精度丢失的深入分析,包括了C++中double浮点数精度丢失的深入分析的使用技巧和注意事项,需要的朋友参考一下 看了一篇关于C/C++浮点数的博文,在Win32下,把int, 指针地址,long等4字节整数赋给一个double后,再用该double数赋给原始类型的数,得到的结果于最初的数值一致,即不存在任何精度丢失。例如下面的结果将总是true: 但是对于l

  • 在单精度浮点数下,当我们输入的数字过大时会导致精度丢失。 比如 输入 16777217 实际存储是 16777216;输入 16777219 实际存储 16777220。 我好奇于为什么当输入 16777217 时就是减掉1,而输入 16777219 时就是加一。 这个是对应的单精度浮点数的存储格式 这个是我所列的转换误差的表格 能够看出 输入 16777217 的时候实际存储时 尾数位的第24位

  • 问题内容: 我在ResultSet.getDate(x)调用中失去了精度。基本上: 返回的日期被截断为MODIFIED是默认精度的Oracle TIMESTAMP字段的日期。我认为可能缺少一些JDBC调整;通常,TIMESTAMP与DATE兼容,但我希望不必重新定义整个表。 问题答案: 传回,而不是。它被定义为一个永恒的日期。如果需要时间戳记,请使用!

  • 问题内容: 我正在尝试从文件中读取一些数字(双精度),并将它们存储在ArrayList和一个数组中(是,我需要两个),其代码如下: } 我尝试读取的文件是: 但是我的代码无法正常工作,hasNextDouble()函数什么也找不到,我在做什么错呢? 编辑:好的,所以我编辑了一下源代码(从Object [] []更改为Double [] []),并将插入值插入到ArrayList中之后,将插入值添加

  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。

  • 如何在Java中从键盘读取双变量?我试图解决这个问题,但没有成功。上面说: 线程“main”java中出现异常。util。java上的输入不匹配异常。util。扫描仪。throwFor(Scanner.java:864)访问java。util。扫描仪。下一个(Scanner.java:1485)是java。util。扫描仪。nextDouble(Scanner.java:2413)位于Main。m