Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 pandas.DataFrame.round不';似乎无法处理我的数据帧-舍入问题会导致csv文件中存储额外的数据_Python_Python 3.x_Pandas_Csv - Fatal编程技术网

Python pandas.DataFrame.round不';似乎无法处理我的数据帧-舍入问题会导致csv文件中存储额外的数据

Python pandas.DataFrame.round不';似乎无法处理我的数据帧-舍入问题会导致csv文件中存储额外的数据,python,python-3.x,pandas,csv,Python,Python 3.x,Pandas,Csv,在使用熊猫数据帧时,我偶然发现了一个小问题: 我有一个大的csv文件(大约2Gb的数据),包含资产的价格,并使用Pandas的DataFrame.to_csv()函数创建,当我仔细检查代码时,我的第一行代码如下所示: DateTime,open,high,low,close 2016-01-04 00:36:18,1.08505,1.08505,1.08504,1.08504 2016-01-04 00:36:19,1.08505,1.08505,1.08504,1.08504 2016-01-

在使用熊猫数据帧时,我偶然发现了一个小问题:

我有一个大的csv文件(大约2Gb的数据),包含资产的价格,并使用Pandas的
DataFrame.to_csv()
函数创建,当我仔细检查代码时,我的第一行代码如下所示:

DateTime,open,high,low,close
2016-01-04 00:36:18,1.08505,1.08505,1.08504,1.08504
2016-01-04 00:36:19,1.08505,1.08505,1.08504,1.08504
2016-01-04 00:36:20,1.08503,1.08503,1.08495,1.08495
2016-01-04 00:36:21,1.0849600000000001,1.0849600000000001,1.0849600000000001,1.0849600000000001
2016-01-04 00:36:22,1.0849600000000001,1.0849600000000001,1.08492,1.08492
数据是使用
df.resample('1s').ohlc()
创建的,我认为有时会有一些舍入问题,所以我尝试使用
df.round(5)
对数据帧进行舍入,以保持最后5位小数,但它根本不会改变任何东西

SEC = pd.read_csv("D:\Finance python\Data\EUR_USD\Sec\S1_2015.csv",index_col='DateTime',parse_dates=True,error_bad_lines=False,infer_datetime_format=True)
SEC = SEC.round(5)
数据帧保持不变,我真想知道为什么

当我尝试使用包含我上面给出的5行的csv文件时:

In[13]: SEC["open"][3]
Out[13]: 1.0849599999999999
在df上进行计算时,这不是问题(即使小数越少,速度可能越快),但似乎有很多0或9被免费存储在我的csv文件中,并且占用了额外的空间

而且,即使在csv文件中看起来很好的值,在使用pandas调用时实际上也不是很全面

有谁知道为什么数据框没有被正确舍入,或者有一个解决方案,当我用pandas保存它们时,有更短的csv文件

提前谢谢

编辑:我尝试使用十进制方法,但仍然不起作用。
我认为这是因为pandas无法在数据帧中存储十进制类型的数字,因此无法将其转换为浮点。

我尝试运行您的代码:

df = pd.read_clipboard(sep=',',engine='python')
df

DateTime    open    high    low close
0   2016-01-04 00:36:18 1.08505 1.08505 1.08504 1.08504
1   2016-01-04 00:36:19 1.08505 1.08505 1.08504 1.08504
2   2016-01-04 00:36:20 1.08503 1.08503 1.08495 1.08495
然后使用
df.round(3)


它对我有效,但当我
df.astype(str).round(3)
时,它就不起作用了。因此我建议您检查数据的
类型

这与浮点运算的精度有关;并非所有数字都能准确表示。如果要将熊猫显示的数字设置为小数点后5位,可以执行以下操作

pd.set_options('display.float_format','{:.5f}')
但内部表示将保持不变(仔细阅读您的帖子后,它不会用csv解决您的问题)

如果要更改内部表示形式,则需要使用
Decimal
数据类型:

from decimal import Decimal
df.round(5).astype(Decimal)
仅供参考,您可以这样重现您的问题:

import numpy as np
np.float64(1.08496)

我在另一篇帖子上找到了问题所在:


我需要使用参数
float_format='%.5f
来获得我想要的csv文件,这个问题与浮点数的工作方式有关。

无法重现您的问题:-)@Wen您用我提供的行尝试了吗?我只尝试了这5行,我遇到了同样的问题,它不会对值进行取整(我在问题中添加了它),实际上不起作用,数据保持不变。当我检查df中数据的类型时,它是一个浮点数,而不是十进制数,我想pandas不允许dataframe中的数据具有十进制类型。您必须重新分配dataframe,例如
df=df.round(5).astype(decimal)
。但是,如果您只对写入csv的数据感兴趣,那么您肯定更喜欢使用
中的
float\u format
参数来读取csv
(我完全忘记了这一点)。我从
df=df.round(0)。astype(Decimal)
中得到
TypeError:dtype''不理解
import numpy as np
np.float64(1.08496)