sas数据转pandas

news2025/1/13 7:57:50

1999年以后的nhanes数据都是以xpt文件格式发布的,而更早的数据有很多是以dat原始数据格式发布,需要将原始数据转为数据表以做进一步统计分析。

以 NHANES III 为例,其中有一个数据Household Youth File,包含3个数据文件youth.dat, youth.sas, YOUTH-acc.pdfYOUTH-acc.pdf是这个数据的概述报告,可以从这个文件找到数据的概况信息,比如样本数量,以及一些代码的含义,比如DMARACER这个变量标识种族,在原始数据中的位置是13,只有1个字符,就是用代码来表示不同种族的:1表示’White’, 2表示’Black’, 3表示’Other’, 8表示’Mexican-American of unknown race’。youth.sas是数据解析的重点,这个文件描述了原始数据的格式,这是一个文本文件,内容为:

 FILENAME YOUTH "D:\Questionnaire\DAT\YOUTH.DAT" LRECL=2103;
    *** LRECL includes 2 positions for CRLF, assuming use of PC SAS;

    DATA WORK;
      INFILE YOUTH MISSOVER;

      LENGTH
        SEQN      7
        DMPFSEQ   5
        DMPSTAT   3
        DMARETHN  3
        DMARACER  3
        DMAETHNR  3
        HSSEX     3
        HSDOIMO   3
        HSAGEIR   3
        HSAGEU    3
        HSAITMOR  4
        HSFSIZER  3
        HSHSIZER  3
        DMPCNTYR  3
        DMPFIPSR  3
        DMPMETRO  3
        DMPCREGN  3
        DMPPIR    8
        ...
        HYK9EO    4
        HYK9FO    4
        HYK11AO  $6
        HYK12SO   4
        HYM1      3
        HYM2      3
        HYM3      3
      ;

      FORMAT
        DMPPIR   Z6.3
        WTPFQX6  Z9.2
        WTPFEX6  Z9.2
        WTPFHX6  Z9.2
        WTPFALG6 Z9.2
        WTPFCNS6 Z9.2
        WTPFSD6  Z9.2
        WTPFMD6  Z9.2
        WTPFHSD6 Z9.2
        WTPFHMD6 Z9.2
        WTPFQX1  Z9.2
        WTPFEX1  Z9.2
        WTPFHX1  Z9.2
        WTPFALG1 Z9.2
        WTPFCNS1 Z9.2
        WTPFSD1  Z9.2
        WTPFMD1  Z9.2
        WTPFHSD1 Z9.2
        WTPFHMD1 Z9.2
        WTPFQX2  Z9.2
        WTPFEX2  Z9.2
        ...
        WTPXRP43 Z9.2
        WTPXRP44 Z9.2
        WTPXRP45 Z9.2
        WTPXRP46 Z9.2
        WTPXRP47 Z9.2
        WTPXRP48 Z9.2
        WTPXRP49 Z9.2
        WTPXRP50 Z9.2
        WTPXRP51 Z9.2
        WTPXRP52 Z9.2
      ;

     INPUT
        SEQN     1-5
        DMPFSEQ  6-10
        DMPSTAT  11
        DMARETHN 12
        DMARACER 13
        DMAETHNR 14
        HSSEX    15
        HSDOIMO  16-17
        HSAGEIR  18-19
        HSAGEU   20
        HSAITMOR 21-24
        HSFSIZER 25-26
        HSHSIZER 27-28
        DMPCNTYR 29-31
        DMPFIPSR 32-33
        DMPMETRO 34
        DMPCREGN 35
        DMPPIR   36-41
        ...
        HYK9DO   2075-2078
        HYK9EO   2079-2082
        HYK9FO   2083-2086
        HYK11AO  2087-2092
        HYK12SO  2093-2097
        HYM1     2098-2099
        HYM2     2100
        HYM3     2101
     ;

      LABEL
        SEQN     = "Sequence number"
        DMPFSEQ  = "Family sequence number"
        DMPSTAT  = "Examination/interview status"
        DMARETHN = "Race-ethnicity"
        DMARACER = "Race"
        DMAETHNR = "Ethnicity"
        HSSEX    = "Sex"
        HSDOIMO  = "Date of screener: month"
        HSAGEIR  = "Age at interview (screener) - qty"
        HSAGEU   = "Age at interview (screener) - unit"
        HSAITMOR = "Age in months at interview (screener)"
        HSFSIZER = "Family size (persons in family)"
        HSHSIZER = "Household size (persons in dwelling)"
        DMPCNTYR = "County code"
        DMPFIPSR = "FIPS code for State"
        DMPMETRO = "Rural/urban code based on USDA code"
        DMPCREGN = "Census region, weighting(Texas in south)"
        DMPPIR   = "Poverty Income Ratio (unimputed income)"
        ...
        HYK9DO   = "Primary drug class code-9th"
        HYK9EO   = "Secondary drug class code-9th"
        HYK9FO   = "Tertiary drug class code-9th"
        HYK11AO  = "ICD-9-CM code-9th"
        HYK12SO  = "For how long been taking (days)-9th"
        HYM1     = "Main respondents relationship to SP"
        HYM2     = "Was SP present during any of interview"
        HYM3     = "Quality of interview"
      ;

可见每一个区段是用区段名;包裹的,我们可以根据INPUT段的内容对原始数据进行处理。youth.dat就是原始数据文件。

定义一个sas解析函数:

# 定义工具函数,解析 sas 文件数据格式
import re

def parse_sas_file(filename):
    with open(filename, 'r') as file:
        sas_content = file.read()

    # 使用正则表达式提取所需内容
    pattern = r'INPUT(.*?)\;'
    match = re.search(pattern, sas_content, re.DOTALL)

    if match:
        input_lines = match.group(1)
    else:
        input_lines = ""

    input_lines = input_lines.strip().splitlines()
    columns_info = {}

    for line in input_lines:
        name, position_range = line.split()
        
        if '-' in position_range:
            start, end = position_range.split('-')
            start, end = int(start) - 1, int(end)
        else:
            start = int(position_range) - 1
            end = start + 1
        
        columns_info[name] = {
            'start': start,
            'end': end
        }

    return columns_info

运行一下:

sas_file_name = 'nhanes3/youth.sas'
dat_file_name = 'nhanes3/youth.dat'

columns_info = parse_sas_file(sas_file_name)
columns_info

输出为:

{'SEQN': {'start': 0, 'end': 5},
 'DMPFSEQ': {'start': 5, 'end': 10},
 'DMPSTAT': {'start': 10, 'end': 11},
 'DMARETHN': {'start': 11, 'end': 12},
 'DMARACER': {'start': 12, 'end': 13},
 'DMAETHNR': {'start': 13, 'end': 14},
 'HSSEX': {'start': 14, 'end': 15},
 'HSDOIMO': {'start': 15, 'end': 17},
 'HSAGEIR': {'start': 17, 'end': 19},
 'HSAGEU': {'start': 19, 'end': 20},
 'HSAITMOR': {'start': 20, 'end': 24},
 'HSFSIZER': {'start': 24, 'end': 26},
 'HSHSIZER': {'start': 26, 'end': 28},
 'DMPCNTYR': {'start': 28, 'end': 31},
 'DMPFIPSR': {'start': 31, 'end': 33},
 'DMPMETRO': {'start': 33, 'end': 34},
 'DMPCREGN': {'start': 34, 'end': 35},
 'DMPPIR': {'start': 35, 'end': 41},
 'SDPPHASE': {'start': 41, 'end': 42},
 'SDPPSU6': {'start': 42, 'end': 43},
 'SDPSTRA6': {'start': 43, 'end': 45},
 'SDPPSU1': {'start': 45, 'end': 46},
 'SDPSTRA1': {'start': 46, 'end': 48},
 'SDPPSU2': {'start': 48, 'end': 49},
 'SDPSTRA2': {'start': 49, 'end': 51},
...
 'HYK11AO': {'start': 2086, 'end': 2092},
 'HYK12SO': {'start': 2092, 'end': 2097},
 'HYM1': {'start': 2097, 'end': 2099},
 'HYM2': {'start': 2099, 'end': 2100},
 'HYM3': {'start': 2100, 'end': 2101}}

再定义一个转为pandas数据帧并存为csv的函数:

import pandas as pd

def dat2csv(dat_file_name, columns_info, csv_file_name):
    # 读取并解析dat文件
    rows = []
    with open(dat_file_name, 'r') as file:
        for line in file:
            temp_dict = {}
            for col, positions in columns_info.items():
                temp_dict[col] = line[positions["start"]: positions["end"]].strip()
            rows.append(temp_dict)

    # 转换为 Pandas DataFrame
    data = pd.DataFrame(rows)
    data.to_csv(csv_file_name)

运行一下:

# 将 dat 文件转存为 csv 文件
dat2csv(dat_file_name, columns_info, 'nhanes3/youth.csv')
df = pd.read_csv('nhanes3/youth.csv')
df.head()

输出为:

运行结果

公众号 | FunIO
微信搜一搜 “funio”,发现更多精彩内容。
个人博客 | blog.boringhex.top

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Type C接口的PCB布局布线要求

USB Type C,又称为USB-C。需要注意的是Type-C只是一种接口,和USB的版本没有任何关系。该接口的亮点在于更加纤薄的设计、更快的传输速度(最高10Gbps以及更强悍的电力传输(最高100W)。 Type-C双面可插接口最大的特点的支持USB接口…

【 OpenGauss源码学习 —— 列存储(Insert)】

列存储(Insert) 概述相关函数ExecInsertRelationData 结构体FormData_pg_class 结构体HeapInsertCStore函数InsertArg 结构体CStoreInsert 类CStoreInsert::InitInsertArg函数heap_deform_tuple 函数bulkload_rows 结构体append_one_tuple 函数bulkload_…

在线图片怎么转换成PDF?在线图片转换成PDF步骤介绍

文件格式要转化不知道怎么办?想要网上下载文件格式转换软件,但是却不知道下载哪个好?今天小编小编就给大家分享一下靠谱的小圆象PDF转换器工具,想知道这款软件好不好用?在线图片怎么转换成PDF?那就进来看看吧。 在线图片怎么转换成PDF 小圆象PDF转换…

LeetCode——二叉树篇(八)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 236. 二叉树的最近公共祖先 235. 二叉搜索树的最近公共祖 迭代 递归 701. 二叉搜索树中的插入操作 450. 删除二叉搜索树中的节点 236. 二叉树的最近公共祖先 给定一个二…

数据加密技术——对称加密和非对称加密

一、数据加密技术 加密是指对数据进行编码变换,使其看起来毫无意义,但同时却仍可以保持其可恢复的形式的过程。在这个过程中,被变换的数据称为明文,它可以是一段有意义的文字或者数据,变换后的数据称为密文。加密机制有…

学习笔记|认识数码管|控制原理|数码管实现0-9的显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第九集:数码管静态显示

文章目录 1.认识数码管2.控制原理十进制转换为任意进制其它进制转十进制 3.数码管实现0-9的显示1.用数组定义0-9的内码段码跟位码的区别2.尝试用延时实现0-9的循环显示3.用按键控制数字的加或者减。 总结课后练习: 1.认识数码管 数码管按段数可分为七段数码管和八段…

C#与西门子PLC1500的ModbusTcp服务器通信4--搭建ModbusTcp客户端

1、客户端选择 客户端可以是一个程序或一个设备,这里我以C#WINFORM程序来实现客户机与PLC的Modbustcp服务器通信,开发环境是VS2019,.NET Framework版本是4.7.2 2、创建winform程序 3、引入Nmodbus协议 4、界面布局如下: 布局中…

无涯教程-PHP - Filtered反序列化

PHP 7引入了Filtered unserialize()函数&#xff0c;以在对不受信任的数据上的对象进行反序列化时提供更好的安全性。 <?phpclass MyClass1 { public $obj1prop; }class MyClass2 {public $obj2prop;}$obj1new MyClass1();$obj1->obj1prop1;$obj2new MyClass2();$obj…

java 版本企业招标投标管理系统源码+功能描述+tbms+及时准确+全程电子化 tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

Java串口开发

网上搜索了关于java串口开发的资料,发现都不是特别的全,故写下一些心得以帮助其他人能快速上手java串口开发,如有错漏之处&#xff0c;敬请指正 串口开发会用到一个javax.comm和RXTXcomm库,&#xff0c;javax.comm库不支持64位操作系统。该库仅适用于32位操作系统,所以接下来主…

SAP S/4 BP(Business Partner)之一次性客商设置

目录 前言 一、一次性客商是什么&#xff1f; 二、BP创建步骤 1.开始步骤 总结 前言 在ECC里的一次性客商跟在S/4有一些区别&#xff0c;本文主要介绍在S/4里创建一次性BP的步骤。 一、一次性客商是什么&#xff1f; 一次性供应商是指我们通常不经常从其采购材料的供应商…

课程实录 | Ingress Controller 的工作原理(下)

原文作者&#xff1a;陶辉 - 杭州智链达数据有限公司&#xff0c;联合创始人兼 CTO 原文链接&#xff1a;课程实录 | Ingress Controller 的工作原理&#xff08;下&#xff09; 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 编者…

Android Lottie加载gson文件动画

一&#xff1a;Lottie的使用 在你工程的build.gradle文件里添加如下配置 implementation com.airbnb.android:lottie:3.4.0二&#xff1a;布局文件直接引入LottieAnimationView <com.airbnb.lottie.LottieAnimationViewandroid:id"id/lottie_view"android:layout…

axios 介绍

axios 介绍 axios 是一款基于 javascript xhr 进行封装的插件&#xff0c;自己通过 xhr 进行编写 ajax 请求&#xff0c;实现起来逻辑比较复杂&#xff0c;axios 封装后将复杂的逻辑写在插件的内部&#xff0c;我们用户只需要关心如何调用即可。对我们的开发带来了很大的便捷。…

在App备案的规则下,开发者的技术选型更加重要了

网站 ICP 备案已施行了很久&#xff0c;我们也非常清楚必须在进行 ICP 备案后&#xff0c;网站才能在大陆范围合法运营&#xff0c;并且用户可以通过域名正常访问网站。 但是月初出了新规&#xff0c;明年起&#xff0c;国内的 App 也要像网站一样进行备案了。想必大家也是早已…

HTTPS证书如何申请?只需这五个步骤

在如今的互联网时代&#xff0c;网络安全变得愈发重要。为了保障网站内数据的安全&#xff0c;许多网站都开始使用HTTPS协议来进行数据传输。而谷歌、百度等搜索巨擘启用全站HTTPS加密服务&#xff0c;更是掀起了网站HTTPS加密的浪潮。那么申请HTTPS证书都需要什么&#xff1f;…

Typora mac版本安装

提示&#xff1a;文章介绍&#xff0c;Typora在Mac系统中免费安装使用 文章目录 一、官网下载二、安装 一、官网下载 官网地址&#xff1a;https://www.typoraio.cn/ 二、安装 安装好后按 command 空格键&#xff0c;找到 Typora的安装路径 /Applications/Typora.app/Con…

信创、工业软件国产化:全面解析三大实时操作系统

信创与国产工业操作系统可以擦出什么火花。 信创技术的快速发展&#xff0c;为国产工业操作系统的研发和应用提供了广阔的空间。 工业操作系统作为工业制造的大脑和神经&#xff0c;工业软件已渗透和应用到工业领域几乎所有核心环节。工业操作系统是智能制造的核心&#xff0c;…

Vue3.2中使用swiper实现层叠式轮播图

介绍 在 vue3 中使用 swiper 实现缩略图的轮播图效果&#xff0c;具体如下图所示&#xff1a; 代码 <template><div classindex><div class"banner-box"><swiper:autoplay"state.autoplay":loop"state.loop":speed&q…

2023 Android 折叠屏适配详解,是时候点亮新技能了

自 2019 年三星发布了第一台&#xff08;柔宇不算&#xff09; Galaxy Z Fold 之后&#xff0c;Android 厂商们都陆续跟进了各自的可折叠方案&#xff0c;之后折叠屏手机市场一直保持快速增长&#xff0c;例如 2023 年上半年整体销量 227 万台&#xff0c;同比增长 102.0%。 虽…