Python sas7bdat模块使用方法

13
我需要从SAS数据集中导出数据。我找到了一个名为sas7bdat.py的Python模块,它可以读取SAS .sas7bdat数据集。考虑到其他所需功能,我认为使用Python完成该项目比使用SAS更简单明了。然而,交互式Python中的help(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()的示例?

谢谢大家。

5个回答

8
随着时间的推移,解决方案变得更加简单。如果你想要使用pandas进行工作,我认为这个方案是最简单的:
import pandas as pd
df = pd.read_sas('/support/sas/locked_data.sas7bdat')

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


4

这只是一个部分回答,因为我没有找到[易于阅读的]具体文档。

您可以在此处查看源代码

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

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

我认为你所寻找的大部分内容都存储在创建SAS7BDAT对象时返回的“header”类中。如果您只打印该类,您会获得很多信息,但您也可以访问类属性。我认为您所寻找的大部分内容可能都在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()命令非常有用。


3

我知道回答有点晚,但如果有人搜索类似的问题。最好的选择是:

import sas7bdat
from sas7bdat import *
foo = SAS7BDAT('/support/sas/locked_data.sas7bdat')
# This converts to dataframe:
ds = foo.to_data_frame()

2

我个人认为更好的方法是使用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。

1
不是每个人都可以使用SAS——你只需要为每个用户支付几千美元来获得此解决方案。哎呀!如果无论如何你要在Python中处理数据,那么使用python库加载数据也可以最小化软件依赖性,并且可以自动处理许多SAS数据集。 - user48956

1

我同意很难找到文档。经过几个小时的尝试和搜索,我最终查看了源代码(在此处找到:https://bitbucket.org/jaredhobbs/sas7bdat/src/master/sas7bdat.py)。从中我了解到它有一个选项fh,用于文件处理程序。因此,如果您需要从s3读取数据,可以这样使用它与s3fs:

import s3fs
import sas7bdat
from sas7bdat import *

fs = s3fs.S3FileSystem(anon=False)
f = fs.open(in_file)
with SAS7BDAT(in_file, encoding = 'latin-1', fh=f) as reader:
    my_df = reader.to_data_frame()

由于我的团队还没有使用 Pandas 1.5,并且早期版本存在一个导致重复字符时数据不正确的错误,因此 Pandas 的 read_sas 函数对我无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接