Python读取SPSS(.sav)文件时日期变量转换异常求助
SPSS日期变量读取后转正确格式的解决方法
问题根源
SPSS的日期数值基准是1582年10月15日,而非Python datetime/time模块默认的Unix时间基准(1970年1月1日),且SPSS不同日期类型的存储单位不同(DATE类型存天数,DATETIME类型存秒数),直接用Unix时间戳转换必然得到错误日期。
方法1:PyreadStat读取时自动解析日期
直接在读取.sav文件时指定参数,让PyreadStat自动处理日期转换,无需手动操作:
import pyreadstat # 读取时自动将SPSS日期转为Pandas datetime类型 df, meta = pyreadstat.read_sav("你的文件.sav", dates_as_pandas_datetime=True)
方法2:手动转换已读取的数值
如果已经将日期读取为float类型,根据SPSS的日期类型选择对应转换方式:
情况1:SPSS DATE类型(存储单位为天数)
from datetime import datetime, timedelta # SPSS日期基准点 spss_epoch = datetime(1582, 10, 15) # 替换为你的日期数值 spss_date_num = 160223 # 计算正确日期 correct_date = spss_epoch + timedelta(days=spss_date_num) # 格式化为目标样式 print(correct_date.strftime("%d-%b-%Y")) # 输出:02-Feb-2021
情况2:SPSS DATETIME类型(存储单位为秒数,如你提供的13831603200)
from datetime import datetime, timedelta spss_epoch = datetime(1582, 10, 15) spss_datetime_num = 13831603200 correct_date = spss_epoch + timedelta(seconds=spss_datetime_num) print(correct_date.strftime("%d-%b-%Y %H:%M:%S"))
方法3:Pandas批量转换
如果用Pandas读取文件,可直接用pd.to_datetime指定基准和单位:
import pandas as pd # 假设date_col是读取的日期列,SPSS DATE类型(天数) df['date_col'] = pd.to_datetime(df['date_col'], origin='1582-10-15', unit='D') # 若是SPSS DATETIME类型(秒数) df['date_col'] = pd.to_datetime(df['date_col'], origin='1582-10-15', unit='s')
内容的提问来源于stack exchange,提问作者Steinunn Sigurjónsdóttir
相关产品推荐
相关产品推荐

