作者:胡国恒 (武汉大学社会保障中心)

Stata 连享会:

提要: 数据处理过程中,研究者常会遇到收集的数据与预期采用的工具不匹配问题。目前,常用的方式是 Datatransfer 等数据格式转换器,通过导入及导出实现数据格式的转换,缺点是软件收费以及当代转换的数据多时,耗时耗力。鉴于此,本文借助于 python 以及 python 与 Stata 相结合的方法提出两种可实现批量数据格式快速转换的方案。

方案一:python 批量转换数据格式

思路 1

首先借助于 python 中 os 库实现对电脑存储下的文件进行调用和处理,生成文件的路径。其次,借助于 python 中强大的 pandas 库读取文件路径( pandas 支持 Stata、SAS、CSV、JSON、SQL 等 15 中常见的数据格式)。最后,借助 pandas 将读取的文件存储为研究者想要的格式即可。

具体介绍 1

python 中 os 是常见的路径操作的模块,可实现对系统下文件的读取、写入以及创建文件等多种操作。本文用到的是 os.listdir(path='.') ,该函数可实现提取路径 (path) 下所有文件的文件名(此处的文件名包括数据格式),并将其作为列表储存。获得路径下所有文件的文件名后,借助 for 循环列表将文件名依次取出并与路径相结合形成具体文件的路径,以便后续 pandas 的读取。文件路径的合并采用的函数是 os.path.join(path,*paths) ,该函数可智能的连接一个或多个路径组件。形成具体文件路径后,借助 pandas 读取,可依据文件格式选择 pandas 的 os tool 中的读存方式即可(多种格式数据的读存方式见下图 1 )。

案例 1

作者收集数据为 CHNS ,该数据原版数据为 SAS 格式。笔者长期采用的数据分析软件为 Stata ,需将 SAS 数据转换为Stata数据,格式由 sas7bdat 转换为 dta 。按照具体介绍,作者预先设置 FindPath 为原SAS数据存储的路径,然后借助 listdir() 查询路径下所有文件名,并将其返回列表 FileNames 存储。其次,遍历 FileNames ,提取 FindPath 路径下每一文件名与 FindPath 路径连接。合成具体文件的路径fullfilename 后,开始借助 pandas 进行读取,因原文件是 sas7bdat 格式,故采用 read_sas() ,预转换格式为 dta ,所有存储方式为 .to_stata() 。在存储过程中本文用到了切片,原因在于 listdir() 提取的 filename 是包括文件名的格式的,因此在存储时要把原文件名的后缀格式去除,因 .sas7bdat 是 9 位数,所以切片为 [:-9] 。另外在保存数据过程中,如不设置,默认保存,如需设置,可在保存时加入保存路径即可。

上述方案的优点是执行速度快,免去手动拖拽的麻烦与时间消耗。作者实践 49 个 SAS 转 Stata 文件仅需数秒。缺点是原文件中对数据名的标签会丢失,针对比较熟悉的数据,可忽略此缺陷。针对此缺点,目前作者尚未寻找 python 的解决办法。

具体代码如下:

import pandas as pd

import os

FindPath = 'C:/Users/nuonu/Desktop/abc/' #python中路径表示与常规路径不同

FileNames = os.listdir(FindPath) #返回指定路径下的文件和文件夹列表

for file_name in FileNames:

fullfilename=os.path.join(FindPath,file_name)

df=pd.read_sas(fullfilename)

df.to_stata(file_name[:-9]+'.dta') #切片是为了去除原格式(.sas7bdat)

借鉴内容: @小小杨:某文件夹下所有文件名的提取。 OS 库与 pandas 库的命令操作语法。

缺陷:原文件中的 label 信息会丢失

保存路径也可自行设置,如:

df.to_stata('C:/Users/nuonu/Desktop/Stata/'+file_name[:-9]+'.dta')

方案二: python 和 Stata 联合转换数据格式

思路 2

鉴于方法 1 数据转换中无法保存数据名 label 的现实问题,作者发现 Stata16 中可导入 Excel、SPSS、SAS、CSV 等多种格式文件,并且能有效保存数据的 label 。因此,笔者想到可借助 python 批量产生 Stata 导入和导出数据的命令,然后放入 Stata 的 do_file 中 ctrl+D 执行,以期实现数据的转换与 label 的保存。

具体介绍 2

因具体介绍 1 中已介绍 OS 模块中 listdir() 的功能,故不在赘述。import 与 save 是 Stata 中导入和导出的命令,常规的命令规范是 import sas [using] filename ,其中 sas 表示的是数据文件,如果导入是 excel 则替换为 excel,filename 是要导入的文件名。导入后,存储为 Stata 数据时,可直接 save,replace 或指定路径进行存储。如果需存储为其他数据格式,可使用 export 格式,目前支持 SAS、CSV 等格式。导出命令举例: export delimited using "H:\a.csv", replace ; delimited 是需要导出的数据文件类型 H:\ 为存储路径,a 为文件名称。

案例 2

与案例 1 目的一致,仍是 SAS 转 Stata 数据。因需导入 Stata 进行数据转换,考虑到 Stata 与 python 绝对路径表达方式的不同,故采用转义符 \ 表示,\\ 生成结果时,会只保留一个 \ 。如案例 1 ,先设置文件夹路径 FindPath 。其次,借助 listdir() 查询文件夹中文件名,返回列表。接着,将未添加文件绝对路径的导入命令 import sas using "C:\Users\nuonu\Desktop\\SAS\ 赋值为 a ,将未添加文件保存路径save "C:\\Users\\nuonu\\Desktop\\Stata\\ 赋值为 b 。最后,遍历循环文件名并分别与 a,并加闭合双引号和 ,clear 形成文件导入文件绝对路径;将 b 与去除文件格式后的遍历文件名相加,并加预保存的文件格式名与闭合双引号。可运行程序,即可形成可放入 Stata 中执行的命令,如图 3 。

具体操作如下:

import os

FindPath = 'C:\\Users\\nuonu\\Desktop\\SAS\\'

FileNames = os.listdir(FindPath) #返回指定路径下的文件和文件夹列表

for file_name in FileNames:

a='import sas using "C:\\Users\\nuonu\\Desktop\\SAS\\'

b='save "C:\\Users\\nuonu\\Desktop\\Stata\\'

print(a+file_name+'"',',clear')

print(b+file_name[:-9]+'.dta'+'"')

借鉴内容: @小小杨:某文件夹下所有文件名的提取。OS 库与 pandas 库的命令操作语法。

执行后结果如图:

将执行结果 copy 后,放入 do 文档;注意:在执行 do 文档时,先导入一次 SAS 文件,目的是让 Stata 设置 import 的默认路径;否则会报错。

Ctrl+D 执行;即可;结果如下图:

总结

上述两种办法皆是基于 python 实现的数据转换。方案一是以 python 为基础,借助 pandas 对数据的读存进行转换。其优点是读存速度快,几行代码一站式解决数据转换;缺点是数据原有 label 会消失,导致数据分析时存在变量识别障碍。方案二是以 python+ Stata 为基础,借助 python 生成 Stata 命令,在 Stata 中执行。其优点是数据保存完整;缺点是耗时长,须命令腾挪。二者的共同之处是不同数据的转换只需变化 python 中的数据格式即可。

参考资料:关于我们Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。

欢迎赐稿: 欢迎赐稿至StataChina@163.com。录用稿件达 三篇 以上,即可 免费 获得一期 Stata 现场培训资格。

python函数手册 stata_Python 与 Stata 配合批量转换数据相关推荐

  1. TShark 批量转换数据包格式

    简述 在某些测试场景下,需要将某一格式的数据包批量转换成另一种格式,通过Wireshark另存导出的方式效率太低,这时候需要考虑使用脚本进行批量转换.本文主要是介绍TShark转换格式的命令,以及如何 ...

  2. python函数手册 下载_python函数手册

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这个时候,为了避免反复编写相同的代码,我们可以使用一个函数来对某段代码块进行封装 ...

  3. python函数手册 stata_Stata连享会-Python量化

    火币量化API的简单使用 火币网(https://www.huobi.io/zh-cn/)是国内比较有名的数据货币交易所,它提供了API接口,可以用来作量化交易. 申请火... 一文搞懂python ...

  4. python函数手册中文_Python中文手册-Python函数

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  5. python函数的参数可以接收哪些类型的数据_python强势来袭-0015-函数中的参数-送礼开始...

    接上一讲,这节我们专门介绍python函数的参数处理 本节主要内容 函数的形式参数和实际参数 函数的参数定义规则 函数参数的默认值 函数的可变参数 函数的关键字参数 函数的命名关键字参数 1.3. 函 ...

  6. python函数手册_python学习手册——内置函数(上)

    内置函数 前面使用过一些函数,有的同学会疑问我没有导入这个函数,为什么可以直接使用? 因为这些函数都是一个叫做builtins模块中定义的函数,而builtins模块默认在Python环境启动的时候就 ...

  7. python函数手册68_直接在python中检索68个内置函数?

    Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name: >>> sorted(k for k, v i ...

  8. python函数的参数可以接收哪些类型的数据_Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数...

    Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数 一.Python参数类型 形参:定义函数时的参数变量. 实参:调用函数时使用的参数变量. 参数传递的过程 ...

  9. Python套壳ImageMagick实现图片格式批量转换

    最近疫情反复,堂姐被抽调到宣传部门发些稿件,发布平台要求图片必须是jpg格式,堂姐是个电脑盲,刚好最近在看入门Python的文章,写个转换图片格式的程序给她,她只要把程序放到有图片的文件夹里运行就好了 ...

最新文章

  1. linux挂载home分区,Linux(CentOS6) 调整 /home 挂载 分区大小
  2. autojs遍历当前页面所有控件_HTML5表单和表单控件的使用
  3. Winform中设置ZedGraph的X轴的刻度根据曲线获取
  4. 致Go学习者, 该跟大佬学习做项目了
  5. Cannot launch SimulationPipeline in local Eclipse
  6. Java 7中对String.substring的更改
  7. python3.x和python2.x唯一区别_Python3.x和Python2.x的区别介绍
  8. binlog数据库不写入binlog_MySQL数据库及InnoDB存储引擎的日志文件
  9. er图转换成关系模型的例题,将ER图转换为关系模型
  10. 【笔记】Android.mk编译apk不生成ota包或者odex包
  11. 单片机编程用什么软件?单片机开发软件有哪些?
  12. VC++ EasyPR车牌识别
  13. 台达plc自由口通讯_台达PLC串行通讯应用原理
  14. OC 实现扫雷达扫描动画
  15. oracle数据库应用(2)
  16. 人力资源管理信息系统
  17. Python画美国盾牌
  18. 【python实现视频解帧并保存到文件夹】
  19. 如何在CentOS8服务器上启用PowerTools
  20. SEO技术:外链建设操作要点

热门文章

  1. 品三国、论国产RISC-V芯片天下大势
  2. c++的STL常用库的使用大总结
  3. 法语书信开篇语结束语句型参考
  4. 首款MeeGo系统上网本 华硕Eee PcX101H独家首测(2-3)
  5. 高频率Vue面试题总结,vue面试就靠它!
  6. ubuntu终端中返回上一次访问的目录
  7. 磁盘未装载apple支持_支持Apple登录
  8. nodejs图片处理工具gm用法
  9. 数据建模(E-R图)
  10. 站控层设备种类和对时方式