12

我必须从 SAS 数据集中转储数据。我发现了一个名为 sas7bdat.py 的 Python 模块,它说它可以读取 SAS .sas7bdat 数据集,我认为由于需要其他功能,用 Python 而不是 SAS 来做这个项目会更简单、更直接。但是,交互式 Python 中的帮助(sas7bdat)不是很有用,我能找到的唯一转储数据集的示例如下:

import sas7bdat
from sas7bdat import *
# following line is sas dataset to convert
foo = SAS7BDAT('/support/sas/locked_data.sas7bdat')
#following line is txt file to create
foo.convertFile('/support/textfiles/locked_data.txt','\t')

这不符合我的要求,因为 a)它使用 SAS 变量名称作为列标题,我需要它来使用变量标签,并且 b)它使用“nan”来表示我宁愿离开的缺失数值值空白。

谁能指出一些关于 sas7bdat.py 中包含的方法的有用文档?我已经用谷歌搜索了我能想到的所有关键词排列,但没有运气。如果没有,有人可以给我一个或两个使用 readColumnAttributes()、readColumnLabels() 和/或 readColumnNames() 的例子吗?

谢谢大家。

4

4 回答 4

5

随着时间的推移,解决方案变得更加容易。如果您想使用熊猫,我认为这是最简单的:

import pandas as pd
df = pd.read_sas('/support/sas/locked_data.sas7bdat')

请注意,通过使用很容易获得一个 numpy 数组df.values

于 2018-08-23T11:32:21.630 回答
4

这只是部分答案,因为我没有发现 [易于阅读] 具体文档。

你可以在这里查看源代码

这显示了有关方法需要哪些参数的一些基本信息,例如:

  • readColumnAttributes(self, colattr)
  • readColumnLabels(self, collabs, coltext, colcount)
  • readColumnNames(self, colname, coltext)

我认为您所追求的大部分内容都存储在使用 SAS7BDAT 创建对象时返回的“标题”类中。如果你只是打印那个类,你会得到很多信息,但你也可以访问类属性。我认为您可能正在寻找的大部分内容都在 foo.header.cols 下。我怀疑您使用各种标头属性作为您提到的方法的参数。

也许这样的事情会让你更接近?

from sas7bdat import SAS7BDAT
foo = SAS7BDAT(inFile) #your file here...

for i in foo.header.cols:
    print '"Atrributes"', i.attr
    print '"Labels"', i.label
    print '"Name"', i.name

编辑:与这个特定问题无关,但是type()dir()命令在试图弄清楚不熟悉的类/库中发生了什么时会派上用场

于 2014-07-16T16:25:13.050 回答
3

我知道我迟到了答案,但万一有人搜索类似的问题。最好的选择是:

import sas7bdat
from sas7bdat import *
foo = SAS7BDAT('/support/sas/locked_data.sas7bdat')
# This converts to dataframe:
ds = foo.to_data_frame()
于 2018-02-14T18:46:13.380 回答
1

我个人认为更好的方法是使用 SAS 导出数据,然后根据需要使用 Python 处理外部文件。

在 SAS 中,您可以这样做...

libname datalib "/support/sas";
filename sasdump "/support/textfiles/locked_data.txt";

proc export
    data = datalib.locked_data
    outfile = sasdump
    dbms = tab
    label
    replace;
run;

这样做的缺点是,虽然使用列标签而不是变量名称,但标签用双引号引起来。在 Python 中处理时,如果它们引起问题,您可能需要以编程方式将其删除。我希望这会有所帮助,即使它不像您想要的那样使用 Python。

于 2013-11-18T18:54:50.167 回答