查看原文
其他

personage与年龄

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈志玲

文字编辑:张馨月

技术总编:张计宝

导读

在stata中经常会遇到计算年龄的数据处理,而我们最常用的就是用date()将数据变为指定数据格式,然后当前日期和出生日期相减,得到最终的年龄。当然所有计算年龄的方式,都逃不过减法。今天我们来介绍一个专门为计算年龄开发的命令——personage。当然personage不仅可以得到人们的年龄还能得到日期之差(天数)。

因为personage是一个外部命令,需要我们先进行安装:

ssc install personage

在stata的说明文档中,personage有两种语法,即personage有两种用法。


一、基本语法

personage bdatevar cdatevar [ifexp] [in range] , generate(yearsvar [daysvar[loyvar]])

bdatevar是出生日期cdatevar是当前日期,中括号里面是可选项,其中if exp表示条件选择表达式,in range表示选择范围。另外generate()选项会生成年龄,即前两个日期的年份之差,其中的可选项daysvar是距离上次生日的天数,loyvar是从上一个生日到下一年该生日日期需要的天数(可能取值为365、366或缺失)。在此处,generate()是必选项。

personage bdatevar [if exp] [in range] , currdate(current_date) generate(yearsvar [daysvar [loyvar]])

同上述一样,bdatevar是出生日期,但是此处没有直接给当前日期,而是经过currdate()获得的。generate()与上述一致。区别在于,currdate()是此处的必选项,而第一种语法是不允许有currdate()的。


二、personage的运用

下面,我们一起来看运用personage的一个例子:目前,我们有一个日期矩阵M,M含有六个人的出生日期,当前时间是2020年5月12日,为了得到这六个人的年龄和距离上一次生日的天数,下面用两种语法实现。

第一步,我们先创建矩阵M:

clearmat values = (28, 19, 28, 29, 28, 29\3, 11, 2, 2, 2, 2\1970, 1980, 1990, 2000, 2010, 2020)

之后需要新生成变量,所以先设置变量个数:

set obs `=colsof(values)'

这里是把矩阵values的列数作为了变量数量,通过colsof()函数获得values的列数,然后将列数定义为宏,再赋值给变量个数。

接下来,将矩阵values的第二行所有数值当做month,第一行所有数值当做day,第三行所有数值当做year,生成出生日期变量bdatevar,并设置当前日期为2020年5月12日,即:

gen bdate = mdy(values[2, _n], values[1, _n], values[3, _n]) gen cdate = mdy(5,12,2020) 

运行程序后,stata的数据集中就有了数据:

此时数据是一串数值,可以看到数据集中还有负数,这是因为,此时的数据是按以1960年1月1日为第0天开始计算的天数,在此之前的时间,则以负数表示。接下来,就可以直接使用personage命令了。

personage bdate cdate, gen(age1 days1)

运行之后,结果如下:

可以看见,此时虽然没有报错,但是stata给了警示信息:bdate和cdate没有格式化为每日日期的日期格式。这是使用personage命令中一个需要注意的地方,bdate和cdate 需要先格式化为日期,然后再使用personage命令,即:

format bdate cdate %td

运行结果如下:

最后用第二种语法来实现上述例子:

personage bdate, currdate(mdy(5,12,2020)) gen(age2days2)

运行结果为:

最终我们可以看到,两种语法获得的结果是一样的。

当然,我们还可以获得每个人上一个生日到下一个生日所需的天数,即:

personage bdate cdate, gen(age1 days1 loy1)

从下面的结果可以看出,产生了两个缺失值,因为第四个和第六个人的生日为2月29日,而2020年是闰年,2021年不是闰年,所以2021年的2月29是不存在的,故为缺失值。

看完本篇介绍,有没有了解personage命令呢!以后遇到计算年龄的数据时,可以试一试哦!

程序:

clearmat values = (28, 19, 28, 29, 28, 29\3, 11, 2, 2, 2, 2\1959, 1980, 1990, 2000, 2010, 2020)set obs `=colsof(values)' gen bdate = mdy(values[2, _n], values[1, _n], values[3, _n]) gen cdate = mdy(5,12,2020) format bdate cdate %td personage bdate cdate, gen(age1 days1)personage bdate, currdate(mdy(5,12,2020)) gen(age2 days2)





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
原来这才是查看盲评结果的正确方式
教你把Python当美图秀秀用(一)
用数据透视表剖析泰坦尼克号乘客数据
读入文本文档,intext来帮忙
matchit——解锁文本相似度的钥匙
基于广义线性模型的机器学习算法——线性回归
听说你会魔法?
dummieslab——从分类变量到虚拟变量的“一步之遥”
线上Python课程都面向哪些方向?
子类与父类
用requests库爬取淘宝数据
WordStat—Stata的文本分析小助手
数据筛选理还乱,datacheck能诊断

如何用简单的手法绘制出不一样的海外疫情趋势图

matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存