我注意到當某些Numpy float64值保存爲Excel文件(通過Pandas DataFrame)時,它們會發生變化。首先,我認爲這與Excel中的一些不精確有關,但Excel似乎將浮點數編碼爲雙精度,所以我對這個觀察有點困惑。Numpy.float64在寫入Excel時發生變化(.xlsx)
>>> import numpy as np
>>> import pandas as pd
# Create a floating point number that exhibits the problem.
>>> ba = bytearray(['\x53', '\x2a', '\xb0', '\x49', '\xf3', '\x79', '\x90', '\x40'])
>>> ba
bytearray(b'S*\xb0I\xf3y\[email protected]')
>>> f = np.frombuffer(ba)
>>> f[0]
1054.4875857854684
# Write to dataframe to save as Excel file.
>>> df = pd.DataFrame({'a': f})
>>> df.to_excel('test.xlsx', engine='xlsxwriter')
# Read excel file (when viewing the file in LibreOffice, the
# value isn't 1054.4875857854684 any more).
>>> df2 = pd.read_excel('test.xlsx')
>>> df2.ix[0,'a']
1054.4875857854699
>>> df2.ix[0,'a'] == f[0]
False
爲什麼不能從Excel中讀取以前編寫的相同的float64?
我也試過用Openpyxl
(.xlsx格式)和Xlwt
(.xls格式)作爲引擎。前者產生與xlsxwriter
相同的錯誤結果,Xlwt
實際上按預期工作,並根據確切的變量值寫入浮點數。是否可能有一個參數,我錯過了.xlsx
格式寫入器引擎?
# this uses the xlwt engine
>>> df.to_excel('test.xls')
>>> df2 = pd.read_excel('test.xls')
>>> df2.ix[0,'a'] == f[0]
True
在實現中,我看着你將'XlsxWriter'中的float格式化部分保留爲undefined。 'attr + ='%s =「%s」'%(key,value)'使用上帝知道什麼樣的格式化精度... – orange
該代碼是針對XML屬性的。 double值使用'%.16g'格式化。從實驗中,這與Excel相匹配(儘管對於某些數字,它似乎使用'%.17g')。我沒有辦法知道,但Excel可能使用專用函數寫入雙打而不是'sprintf()'。至少從性能的角度來看,這是有意義的。無論哪種方式,這都是雙精度的邊緣,所以有些損失是不可避免的。如果您有興趣,您應該在Excel中創建數字並查看輸出XML中的表示形式。 – jmcnamara