将SAS数据文件导入python数据框

时间:2015-06-18 09:42:36

标签: python pandas sas

我正在研究一种数据集(PSID),它以SAS格式(.txt和另一个包含解释数据的指令的文件)提供数据。我在Python中找不到任何东西来读取这种类型的数据。

有没有人知道用于读取SAS数据的预先存在的模块/脚本?

编辑(从评论添加到答案):数据是ascii / text,一行数据的开头是这样的:

3 10 1015000 150013200 00 002500 00 00

7 个答案:

答案 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_fwfread_table可能会更好。取决于变量类型和格式。

据我所知,@ hd1提到的sas7bdat似乎运作良好,但还不是大熊猫的一部分。出于这个原因,我倾向于默认为read_stataread_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 数据 SAS7BDATxpt 格式 SAS 数据时,我正在寻找可用于读取这些数据集的不同库和包,其中,我将图书馆入围如下:

  1. pandas(由于社区支持和 性能)
  2. SAS7BDAT(只能读取 SAS7BDAT 个文件,上次发布时间为 2019 年 7 月)
  3. pyreadstat(根据文档的有希望的性能以及读取元数据的能力)

在拿起任何包之前,我做了一些性能基准测试,我发现 pyreadstatpandas 快,(似乎它在读取文档中提到的数据时使用了多处理,但我'我不确定),而且使用 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)