有没有Python模块可以打开IBM SPSS(即.sav)文件?如果有最好是最新的,不需要任何额外的dll文件/库。
有没有Python模块可以打开IBM SPSS(即.sav)文件?如果有最好是最新的,不需要任何额外的dll文件/库。
我发布了一个名为“pyreadstat”的Python包,它可以读取SPSS(sav、zsav和por)、Stata和SAS文件。它是围绕C库ReadStat包装的,因此非常快速。 ReadStat是R库Haven后端使用的库,该库被广泛使用且非常稳健。
该软件包是自包含的。它不需要使用R(无需安装额外的应用程序),也不依赖于IBM dll或其他外部库。
例如,要读取SPSS sav文件,您可以执行以下操作:
import pyreadstat
df, meta = pyreadstat.read_sav("/path/to/sav/file.sav")
df 是一个 pandas 的数据帧。Meta 包含元数据,例如变量标签或值标签。 read_sav 读取 sav 和 zsav(压缩)文件。还有一个 read_por 函数用于旧的 por(便携式)文件。
您可以在这里找到它:https://github.com/Roche/pyreadstat
scipy.io
中有一个名为readsav
的函数适用于我,并且已经包含在内。另一个使用pandas.rpy.common
的最佳答案对我也不起作用,因为显然这不是rpy
包含的属性。 - Steven Thomaspd.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()函数的参数详解:
参数
----------
path:字符串或路径类型
文件路径usecols:类似列表的对象,可选参数
返回子集列。如果为None,则返回所有列。
convert_categoricals:布尔值,默认为True
转换分类列为pd.Categorical类型。返回值
-------
DataFrame
根据你想做的事情——使用rpy2中的R相关命令来处理数据,或者切换到Python——有一个相关主题上由@Spacedman提供的解决方案可能很容易地适应你的需求。
否则,Pandas包括一个方便的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
com.convert_robj(rdf)
替换为pandas2ri.ri2py(rdf)
。但是com.robj.r('foreign::read.spss("%s", to.data.frame=TRUE)' % filename)
怎么办? - Pyderman但使用IBM库的好处在于,它们可以正确处理这种相当复杂的二进制文件格式。它们是免费的,使您免于为此格式编写代码的负担,并且许可证允许您重新分发它们。还有什么更好的要求呢?
以下是您可能感兴趣的软件包:
savReaderWriter(Bitbucket上)
savReaderWriter 3.4.2(Python Package Index Repo中)
我和@Pyderman有同样的问题,关于如何更新这个pandas版本(>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()
from scipy.io import readsav
import pandas as pd
sav_df = readsav('file.sav')
df=pd.DataFrame(sav_df)
.dll
。我找不到任何有关该文件格式的开放规范,这意味着读取这些文件的唯一方法是使用IBM的库。您始终可以尝试反向工程格式,但这需要更多的时间和精力。 - Bakuriu