Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python openpyxl:从Excel中丢失精度读取浮动?_Python_Excel_Openpyxl - Fatal编程技术网

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

Python openpyxl:从Excel中丢失精度读取浮动?,python,excel,openpyxl,Python,Excel,Openpyxl,我正在使用OSX,我的Excel工作簿中有一些数据,这些数据的格式是数字(以下是示例) 现在,我正试图用Python和openpyxl导入它们: 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

我正在使用OSX,我的Excel工作簿中有一些数据,这些数据的格式是数字(以下是示例)

现在,我正试图用Python和openpyxl导入它们:

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) “时间”正确读取为datetime.Time对象

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
[25]中的
:价格[0]。价值
Out[25]:205.85
[26]中:类型(价格[0]。值)
Out[26]:浮动
在[27]中:价格[17]。价值
Out[27]:206.18
[28]中:价格[17],价值<206.18
Out[28]:假
而不是206.1799,这也是Excel(单元格B19)中的显示方式

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

有没有不使用熊猫的原因

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
加布里埃尔

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

IBM_wb1 = wb1.get_sheet_by_name('IBM')
您可以使用更新openpyxl版本

pip install openpyxl --upgrade

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

Pandas在内部使用xlrd。为什么不删掉中间人?谢谢@DeepSpace,但我仍然没有得到206.1799,这是一个预览链接,我想知道这是否是Jupyter或IPython的副作用,因为在我的系统上openpyxl报告值为
ws=wb.active;ws['B19'].值;206.1799
格式设置仅与日期时间的openpyxl相关,因为这是识别它们的唯一方法。请注意,现在我想起来这是有道理的。我将从我的评论中编辑这一部分。