数据文件.dta乱码解决

因研究需要,要打开手里的某个数据库,看了下数据库内数据格式为.dta格式,经上网搜索为stata软件所用格式。首先想到的是使用python进行数据转换。但在用pandas打开并转换的过程中,发现出现乱码问题,使用encoding参数尝试了多种编码格式也没有得到解决。不得已只好下载了Stata15.1。不料Stata软件打开仍然是乱码,查询发现有一个令人哭笑不得的事情:

Stata 14 开始使用新的编码系统,以便支持多种语言。Stata 15 进一步做了调整,动作比较大。这就导致在 Stata 14 和 15 中打开 Stata 13 以前的 dofile,.dta 文档时,其中包含的中文字符会显示为乱码。

不得不再去查询Stata15版本读取之前数据文件的方法,最终代码如下:

* Change working directory
cd D:\Data\****\
unicode encoding set gb18030
unicode analyze ****.dta
unicode retranslate ****.dta, invalid(mark) transutf8

本段代码为将gb18030编码的旧数据文件转换为utf-8编码。需要注意,代码运行完成后会替换原文件,因此建议提前备份原数据。

批量编码转换:

若有大量数据,可以使用下面代码进行批量转换:

需要首先下载安装ua:Stata连享会 / ua

转换所有的.dta文件:

* Change current working directory (CWD)
cd D:\data\*****\

* Unicode all .dta files in CWD and files in sub-directories
ua: unicode encoding set gb18030
ua: unicode translate *.dta

转换目录下所有文件:

* Change current working directory (CWD)
cd D:\data\*****\

* Unicode all files (.do, .ado, .dta, .hlp, etc.) in CWD and files in sub-directories
ua: unicode encoding set gb18030
ua: unicode translate *

使用pandas转换.dta文件为.csv

附上Python下pandas读取文件及转换代码:(需要注意,即使在已知使用编码为gb18030的前提下,编写代码从gb18030转换为utf-8,仍未成功,原因待进一步研究。不过在上面通过stata转换为utf-8之后,可以在pandas内成功读取。)

import os
os.chdir("D:/Data/*****/")
import pandas as pd
data = pd.io.stata.read_stata('2002.dta',encoding='utf-8')
data.to_csv('2002.csv',encoding='utf-8')

其它

中文常用编码:gb*编解码器(gb18030,gbk,gb2312)或UTF编码解码器(UTF-8,UTF-16,或UTF-32)。

参考资料:
[1] STATA 14 unicode编码,解决中文乱码问题
[2] Stata15:一次性转码,解决中文乱码问题
[3] 当使用熊猫read_stata()函数时,汉字全部变成乱码