我有一个包含一些浮点数据的csv文件。 代码很简单
df = pd.read_csv(my_csv_vile)
print(df.iloc[:2,:4]
600663.XSHG 000877.XSHE 600523.XSHG 601311.XSHG
2016-01-04 09:31:00 49.40 8.05 22.79 21.80
2016-01-04 09:32:00 49.55 8.03 22.79 21.75
然后我将其转换为 float32 以节省内存使用量。
short_df = df.astype(np.float32)
print(short_df.iloc[:2,:4])
600663.XSHG 000877.XSHE 600523.XSHG 601311.XSHG
2016-01-04 09:31:00 49.400002 8.05 22.790001 21.799999
2016-01-04 09:32:00 49.549999 8.03 22.790001 21.750000
值刚刚改变! 如何保持数据不变?
(我也尝试了short_df.round(2)
,但打印仍然得到相同的输出(
许多十进制浮点数不能用 float64 或 float32 准确表示。例如,如果您不熟悉浮点指南,请查看该问题。
Pandas 默认显示精度为 6 的浮点数,默认输出中将删除尾随的 0。
float64 可以准确地表示精度高达 6 或超过(及更高(的示例数字,而 float32 不能:
>>> print("%.6f" % np.float64(49.40))
49.400000
>>> print("%.6f" % np.float32(49.40))
49.400002
如果在打印 df 时对超过 2 位数字的精度不感兴趣,可以设置显示精度:
pd.set_option('precision', 2)
然后,即使使用 float32s,您也可以获得相同的输出:
>>> df.astype(np.float32)
600663.XSHG 000877.XSHE 600523.XSHG 601311.XSHG
2016-01-04 09:31:00 49.40 8.05 22.79 21.80
09:32:00 49.55 8.03 22.79 21.75
如果要在写回 csv 文件时删除第 2 位以外的所有内容,请使用float_format:
df.to_csv(file_name, float_format="%.2f")