我正在研究一种数据集(PSID),它以SAS格式(.txt和另一个包含解释数据的指令的文件)提供数据。我在Python中找不到任何东西来读取这种类型的数据。
有没有人知道用于读取SAS数据的预先存在的模块/脚本?
编辑(从评论添加到答案):数据是ascii / text,一行数据的开头是这样的:
3 10 1015000 150013200 00 002500 00 00
答案 0 :(得分:3)
从版本17开始,Pandas现在支持使用.xpt文件扩展名读取sas文件。有关其他详细信息,请参阅this link到pandas文档。
df = pd.read_sas('sas_xport.xpt')
答案 1 :(得分:1)
当您可以选择下载SAS数据集时,您通常也可以选择下载Stata数据集(这确实是PSID btw的情况)。在这种情况下,最简单的方法可能是使用read_stata
导入(这可能会在未来发生变化,但我相信这是一个非常准确的陈述)。
不太方便,但几乎总是一个选项,是下载文本文件(通常称为text,ascii或csv)。那些往往有两种形式:分隔(用逗号或制表符),或空格分隔(列或列表)。如果文件是逗号或制表符分隔符,请使用read_csv
并根据需要设置分隔符。如果它是以空格分隔的或表格式的,那么read_csv
可能会带来好运,或者使用read_fwf
或read_table
可能会更好。取决于变量类型和格式。
据我所知,@ hd1提到的sas7bdat
似乎运作良好,但还不是大熊猫的一部分。出于这个原因,我倾向于默认为read_stata
或read_csv
,但希望sas7bdat
也能很好地运作,并且将来可能会被带入大熊猫。另外,我想知道sas7bdat
的速度。 read_csv
很长一段时间都非常快,read_stata
在最新版本中速度非常快(我认为15.0以来)。我不确定sas7bdat
的速度?
答案 2 :(得分:1)
所以我写了一个可以导入数据的包。它可以在这里找到:
https://pypi.python.org/pypi/psid_py
这是我的第一个包裹,对于草率的工作很抱歉。此外,它仅针对PSID数据集进行了测试,并且我认为其他SAS格式存在错误。然而,有些事情比什么都好。
除了阅读sas数据外,它还会为您构建面板数据,以防您进入此类事件。
答案 3 :(得分:1)
我知道这是一个很晚的回复,但我认为我的回答对未来的读者有用。几个月前,当我不得不读取和处理 SAS
数据 SAS7BDAT
或 xpt
格式 SAS
数据时,我正在寻找可用于读取这些数据集的不同库和包,其中,我将图书馆入围如下:
pandas
(由于社区支持和
性能)SAS7BDAT
(只能读取 SAS7BDAT
个文件,上次发布时间为 2019 年 7 月)pyreadstat
(根据文档的有希望的性能以及读取元数据的能力)在拿起任何包之前,我做了一些性能基准测试,我发现 pyreadstat
比 pandas
快,(似乎它在读取文档中提到的数据时使用了多处理,但我'我不确定),而且使用 pyreadstat
时的内存消耗和占用空间比 pandas
少得多,而且它能够读取元数据,甚至只允许读取元数据,所以我最终选择了 pyreadstat
。
使用pyreadstat
读取的数据已经是dataframe的形式了,所以不需要手动转换成pandas的dataframe。
import pyreadstat
#for SAS7BDAT files
df, _ = pyreadstat.read_sas7bdat('some_file.sas7bdat')
#for xpt files
df, _ = pyreadstat.read_xpt('some_file.xport')
以下是针对 CDISC 的真实数据(原始数据和标准化数据)执行的一些基准测试(将文件读取到数据帧的时间),文件大小范围从几 KB 到几 MB,包括 xpt 和 sas7bdat 文件格式:< /p>
Reading ADAE.xpt 49.06 KB for 100 loops:
Pandas Average time : 0.02232 seconds
Pyreadstat Average time : 0.04819 seconds
----------------------------------------------------------------------------
Reading ADIE.xpt 27.73 KB for 100 loops:
Pandas Average time : 0.01610 seconds
Pyreadstat Average time : 0.03981 seconds
----------------------------------------------------------------------------
Reading ADVS.xpt 386.95 KB for 100 loops:
Pandas Average time : 0.03248 seconds
Pyreadstat Average time : 0.07580 seconds
----------------------------------------------------------------------------
Reading beck.sas7bdat 14.72 MB for 50 loops:
Pandas Average time : 5.30275 seconds
Pyreadstat Average time : 0.60373 seconds
----------------------------------------------------------------------------
Reading p0_qs.sas7bdat 42.61 MB for 50 loops:
Pandas Average time : 15.53942 seconds
Pyreadstat Average time : 1.69885 seconds
----------------------------------------------------------------------------
Reading ta.sas7bdat 33.00 KB for 100 loops:
Pandas Average time : 0.04017 seconds
Pyreadstat Average time : 0.00152 seconds
----------------------------------------------------------------------------
Reading te.sas7bdat 33.00 KB for 100 loops:
Pandas Average time : 0.01052 seconds
Pyreadstat Average time : 0.00109 seconds
----------------------------------------------------------------------------
Reading ti.sas7bdat 33.00 KB for 100 loops:
Pandas Average time : 0.04446 seconds
Pyreadstat Average time : 0.00179 seconds
----------------------------------------------------------------------------
Reading ts.sas7bdat 33.00 KB for 100 loops:
Pandas Average time : 0.01273 seconds
Pyreadstat Average time : 0.00129 seconds
----------------------------------------------------------------------------
Reading t_frcow.sas7bdat 14.59 MB for 50 loops:
Pandas Average time : 7.93266 seconds
Pyreadstat Average time : 0.92295 seconds
如您所见,对于 xpt 文件,读取文件的时间并没有更好,但是对于 sas7bdat 文件,pyreadstat 的性能仅优于 pandas。
上述基准测试是在 pyreadstat 1.0.9、pandas 1.2.4 和 Python 3.7.5 上执行的。
答案 4 :(得分:0)
查看您获得的SAS代码。您应该看到它的格式非常一致,以便您可以解析变量名称和要为这些变量读取的列。例如,在本文https://psidonline.isr.umich.edu/Guide/FileStructure.pdf中,您可以看到INPUT语句的格式为:
INPUT
ER30001 2 - 5
ER30002 6 - 8
ER30642 1528 - 1532
ER30643 1533 - 1534
...
;
因此,只需阅读SAS程序并生成相应的Python,即可使用相同的变量名读取文本文件。
答案 5 :(得分:0)
数据与表格固定。修复意味着例如第3个值在第15个字母的每一行开始,直到114个字母。
1.打开SAS或SPSS输入声明。如果是SAS,你会发现类似的东西:
@1 ANO_CENSO 5. /*Ano do Censo*/
@6 PK_COD_ENTIDADE 9. /*Código da Escola*/
@15 NO_ENTIDADE $Char100. /*Nome da Escola*/
@115 COD_ORGAO_REGIONAL_INEP $Char5. /*Código do Órgão Regional de Ensino*/
左边的数字是列(字母数,相应的值)
2.在下面的脚本中,填写列,首先是列名称,第二个元组是第一个,列是第一个和最后一个字母/变量的数字。注意SAS开始计数为1,python为0。
import pandas as pd
columns=(
('ANO', (0, 5)),
('CODE', (5, 14)),
('DESC_SITUACAO_FUNCIONAMENTO', (119, 134)),
('FK_COD_ESTADO', (176, 178)),
('SIGLA', (178, 181)),
)
df = pd.read_fwf('TS_ESCOLA.TXT', names=zip(*columns)[0], colspecs=zip(*columns)[1], header=None)
// pd.read_fwf是由pandas的读者修复的。
答案 6 :(得分:0)
我知道这是一篇旧文章,但是如果有人通过google访问此页面,只是想提供一种有效的方法。
我们可以使用pyreadstat进行相同的操作(可以获取数据和元数据)。
import pyreadstat
df, meta = pyreadstat.read_sas7bdat('/path/to/a/file.sas7bdat')
或使用以下代码保存熊猫框架
pyreadstat.write_xport(df, "path/to/destination.xpt", file_label="test", column_labels=column_labels)