读取SAS文件时,Pandas失败且数据类型正确

时间:2018-03-01 22:04:24

标签: python pandas types sas

我有SAS dataset,当我运行它时,我在SAS上获得以下输出:

enter image description here

我还有以下Python代码,它获取.sas7bdat文件并显示输出,即此处的前五个观察结果。

import pandas as pd
file_name = "cars.sas7bdat"
my_df = pd.read_sas(file_name)
my_df = my_df.head()
print(my_df)

enter image description here

正如您所看到的,当涉及整数数据类型时,它无法正常工作。 CYL和WGT变量是整数但如果我使用pandas'read_sas function则无法正确显示。

知道这是怎么回事?

2 个答案:

答案 0 :(得分:2)

SAS将所有数字表示为64位(8字节)浮点数。但是你可以通过告诉它存储少于8个字节来节省磁盘空间。您发布的数据集是为CYL和WGT做的。

enter image description here

当SAS从磁盘读回数据集以使用它时,将缺少的最低有效字节设置为二进制零。显然read_sas没有理解这一点,而不是将丢失的字节设置为二进制零,而是做了其他事情。因此看似随机的数据。

CYL的第一个值是8,它在IEEE浮点数中是十六进制代码

40 20 00 00 00 00 00 00

您显示的8.00046值将改为此值。

40 20 00 06 07 80 FD C1

答案 1 :(得分:1)

终于解决了这个问题。嗯,这似乎绝对是熊猫'错误。我通过输入(安装)直接使用.sas7bdat库:

pip install sas7bdat

然后我运行以下代码:

import sas7bdat
from sas7bdat import *

file_name = file_path + "cars.sas7bdat"
foo = SAS7BDAT(file_name)
my_df = foo.to_data_frame()
my_df = my_df.head()
print(my_df)

运行上面的代码后,我在Python中得到以下输出:

enter image description here

因此,我得到了显示正确数据类型的输出。

希望pandas开发人员找到上述bug的解决方案。