Python如何读取.dta文件并保留Stata格式的周度时间变量
解决Python读取Stata .dta文件周度时间格式错位问题
Stata的YYYYwW格式属于自定义周度时间编码,Python读.dta的常用库默认会将其映射为标准datetime类型,自动转为对应起始日的日期格式,才会出现你遇到的输出错位问题,可通过以下两种方法解决:
方法1:读取时禁用自动日期转换,直接保留原始值
使用pandas的read_stata方法时传入convert_dates=False参数,关闭全局日期自动解析,直接拿到Stata中存储的原始周度标识:
import pandas as pd # 读取时关闭所有日期自动转换 df = pd.read_stata("你的文件路径.dta", convert_dates=False) # 输出验证,此时周度变量会保持和Stata一致的YYYYwW格式 print(df["你的周度变量列名"].head())
如果需要其他日期列正常解析,仅跳过周度列的转换,可以单独指定要解析的日期列:
# 仅将指定的其他日期列自动转为datetime,周度列保留原始值 df = pd.read_stata("你的文件路径.dta", convert_dates=["其他日期列1", "其他日期列2"])
方法2:将已转换为datetime的列反向还原为Stata周度格式
如果已经将数据读入且周度列被转为了datetime类型,可以手动计算还原为YYYYwW格式:
# 假设被自动转换的周度列名为week_col # pandas 1.1.0及以上版本 df["stata_week"] = df["week_col"].dt.year.astype(str) + "w" + df["week_col"].dt.isocalendar().week.astype(str) # pandas 1.1.0以下版本 # df["stata_week"] = df["week_col"].dt.year.astype(str) + "w" + df["week_col"].dt.week.astype(str)
注意事项
- Stata默认周度规则是每年第一周从1月1日开始,和ISO周度规则可能存在1周的偏差,需要严格对齐的话优先使用方法1读取原始值
- 如果周度变量在Stata中是带值标签的数值类型,读取时可以额外传入
convert_categoricals=True保留标签内容,直接提取标签作为周度标识即可
内容的提问来源于stack exchange,提问作者mirko_vucinic
相关产品推荐
相关产品推荐

