是否有一个 Python 模块来打开 SPSS 文件



是否有一个模块供Python打开IBM SPSS(即.sav)文件?如果有不需要任何额外 dll 文件/库的最新内容,那就太好了。

我发布了一个python包"pyreadstat",它读取SPSS(sav,zsav和por),Stata和SAS文件。它是C库ReadStat的包装器,因此速度非常快。Readstat 是 R 库 Haven 后面使用的库,它使用广泛且非常健壮。

包是自动包含的。它不需要使用 R(无需安装其他应用程序),也不依赖于 IBM dll 或其他外部库。

例如,为了读取 SPSS 保存文件,您需要执行以下操作:

import pyreadstat
df, meta = pyreadstat.read_sav("/path/to/sav/file.sav")

DF是一个熊猫数据帧。元维基包含变量标签或值标签等元数据。read_sav读取 sav 和 zsav(压缩)文件。还有一个功能read_por用于旧的 por(便携式)文件。

你可以在这里找到它:https://github.com/Roche/pyreadstat

当你有熊猫>= 0.25.0时,你现在终于可以做pd.read_spss()

# you need pandas >= 0.25.0 for this    
import pandas as pd
df = pd.read_spss('your_spss_file.sav')

这需要库 pyreadstat,因此您可能必须先安装它:

pip install pyreadstat

有关 pd.read_spss() 参数的额外信息:

参数

---------- 路径:字符串或路径
文件路径

使用列表:类似列表,可选
返回列的子集。如果为"无",则返回所有列。

convert_categoricals:布尔值,默认值为 True
将分类列转换为 pd。分类。

返回

-------数据帧

根据你想要做什么——使用 rpy2 中的 R 相关命令处理数据,或者切换到 Python——相关线程上的 @Spacedman 提供的解决方案可能很容易适应你的需要。

否则,熊猫包括一个方便的包装纸 用于rpy2 .以下是与 Peat 和 Barton 的 weights.sav 数据集一起使用的示例:

>>> import pandas.rpy.common as com
>>> filename = "weights.sav"
>>> w = com.robj.r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
>>> w = com.convert_robj(w)
>>> w.head()
     ID  WEIGHT  LENGTH  HEADC  GENDER  EDUCATIO              PARITY
1  L001    3.95    55.5   37.5  Female  tertiary  3 or more siblings
2  L003    4.63    57.0   38.5  Female  tertiary           Singleton
3  L004    4.75    56.0   38.5    Male    year12          2 siblings
4  L005    3.92    56.0   39.0    Male  tertiary         One sibling
5  L006    4.56    55.0   39.5    Male    year10          2 siblings

作为人们稍后发现的注释(像我一样):pandas.rpy在最新版本的 pandas (>0.16) 中已被弃用,如此处所述。该页面包含有关更新代码以使用 rpy2 接口的信息。

但是使用 IBM 库的好处是,它们使这种相当复杂的二进制文件格式正确。 它们是免费的,减轻了您为此格式编写代码的负担,并且许可证允许您重新分发它们。 你还能问什么?

以下是您可能感兴趣的软件包

  • savReaderWriter on Bitbucket

  • savReaderWriter 3.4.2 in Python Package Index Repo

我和@Pyderman有同样的问题,关于如何为熊猫更新它(>0.16)。这就是我想出的:

from rpy2.robjects import pandas2ri, r
filename = 'weights.sav'
w = r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
df = pandas2ri.ri2py(w)
df.head()

您可以使用 python 接口进行 R,然后在 library(foreign) 中使用 read.spss 导入数据。

from scipy.io import readsav
import pandas as pd
sav_df = readsav('file.sav')
df=pd.DataFrame(sav_df)

最新更新