如何用savReader读取SPSS文件转CSV且避免日期转浮点数
解决SPSS .sav文件转CSV时的字节字符串与日期格式问题
这个问题我之前处理SPSS数据时也碰到过,savReaderWriter在Python 3下的字节/类型处理确实有点棘手,尤其是当数据里混合了字符串、数值和日期的时候。给你两个实用的解决方案:
方案一:手动逐元素解码(适配savReaderWriter)
核心思路是写一个小函数,逐个检查每行的元素:如果是字节类型就解码成UTF-8字符串,数值、NaN这类非字节类型直接保留,这样既解决了字符串的b''问题,又不会破坏日期和数值的格式。
完整代码如下:
import savReaderWriter import csv def decode_item(item): # 只解码字节类型,其他类型原样返回 if isinstance(item, bytes): return item.decode('utf-8') return item with savReaderWriter.SavReader('input_filename.sav') as reader: # 先解码表头 decoded_header = [decode_item(h) for h in reader.header] with open('output_filename.csv', 'w', newline='', encoding='utf-8') as output: writer = csv.writer(output, delimiter=',') writer.writerow(decoded_header) # 逐行解码数据并写入 for row in reader: decoded_row = [decode_item(item) for item in row] writer.writerow(decoded_row)
这个方法的好处是完全基于你原来的代码修改,不需要引入新库,日期会保持SPSS里的原始字符串格式(比如'2017-09-02'),不会变成错误的浮点数。
方案二:用Pandas一键处理(更省心)
如果可以引入第三方库,Pandas的read_spss方法已经帮我们封装好了所有类型转换逻辑——自动解码字节字符串、正确解析日期格式,代码简洁到离谱:
import pandas as pd # 读取.sav文件,自动处理类型转换 df = pd.read_spss('input_filename.sav') # 导出为CSV,na_rep用来处理NaN值(转成空字符串) df.to_csv('output_filename.csv', index=False, na_rep='', encoding='utf-8')
如果需要自定义日期格式,比如把datetime类型转成YYYY-MM-DD字符串,可以加一行:
# 假设你的日期列名叫"date_col" df['date_col'] = df['date_col'].dt.strftime('%Y-%m-%d')
顺便解释下你之前踩的坑:
ioUtf8=True导致日期变浮点数:SPSS的日期是存储为从特定基准日开始的时间戳数值,开启ioUtf8后,savReaderWriter没有自动解析日期格式,直接返回了原始数值,所以转成datetime才会出现2404年这种错误。- 用
wb打开文件报错:csv.writer默认是面向文本模式的文件,二进制模式下要求所有写入内容都是字节类型,但你的数据里有数值、NaN,转字节会更麻烦,完全没必要这么做。
内容的提问来源于stack exchange,提问作者HalfRyot
相关产品推荐
相关产品推荐

