pandas pyreadstat读取和写入spss而不丢失数据

8yparm6h  于 2023-01-11  发布在  其他
关注(0)|答案(2)|浏览(258)

要使用panda/pyreadstat读取spss .sav文件,可以用途:

df, meta = pyreadstat.read_sav()

要写入 Dataframe ,请用途:

pyreadstat.write_sav(df)

我怎样才能读,编辑和写一个.sav文件而不丢失任何 meta数据,像标签和其他可以在spss中更改的东西?
如果这完全不可能,那么最接近于不丢失数据的方法是什么?

rbl8hiat

rbl8hiat1#

说话是廉价的,这里的代码。:-)

# using pyreadstat
from pyreadstat import write_sav

class TempFile(type(pathlib.Path())):  # type: ignore
    def __exit__(self, exc_type, exc_val, exc_tb):
        filepath = str(self.absolute())
        try:
            os.remove(filepath)
        except OSError:
            logger.exception('romve temporary file: %s failed!', filepath)
        self._closed = True

class SpssTool:
    @classmethod
    def to_spss(cls, df: DataFrame, io: BytesIO, metadata: metadata_container, *, compress: bool = False):
        """Writes a pandas dataframe to a BytesIO object.

        Parameters
        ----------
        df : pandas.DataFrame
            pandas data frame to write to sav or zsav
        io : BytesIO
            the buffer to save spss file
        metadata: metadata_container
            spss file meta data container
        compress : bool
            whether compress to zsav.
        """

        df.columns = SpssTool.get_legal_column_names(df.columns.to_list())

        with TempFile(f'/tmp/{uuid4().hex}.{"zsav" if compress else "sav"}') as fp:
            write_sav(
                df=df,
                dst_path=fp,
                column_labels=metadata.column_labels if metadata else None,
                variable_value_labels=dict(metadata.variable_value_labels) if metadata else {},
                variable_measure=metadata.variable_measure if metadata else None,
            )
            io.write(fp.read_bytes())

部分解释

  • 第一个月

这是必要的,因为spss文件对列名有限制,详见官方文件:https://www.ibm.com/docs/en/spss-statistics/27.0.0?topic=view-variable-names

  • metadata_container

这是来自from pyreadstat import metadata_container。容器保存有关数据集的信息,您可以在以下位置找到更多详细信息:https://ofajardo.github.io/pyreadstat_documentation/_build/html/index.html#metadata-object-description
这些也许是你需要的。

2mbi3lxu

2mbi3lxu2#

函数write_sav有很多参数来设置不同的元数据,例如column_labels、variable_value_labels等。
当使用read_sav时,除了dataframe df之外,你还会得到一个元数据对象meta,你会在原始文件中找到许多这样的元数据片段。你可以编辑它们(或不编辑),然后将它们传递给write_sav不同的参数,以便设置元数据。
话虽如此,可能不可能像在SPSS中那样设置每一块元数据,所以这是您所能得到的最接近的。
请阅读文档,了解write_sav有哪些参数,以及读取read_sav时会获得哪些元数据。此文档还向您介绍了自述文件中解释如何设置不同元数据的位置,因此自述文件也是一个很好的信息来源。
documentationreadme

相关问题