Stata17之日期时间新功能
本文作者:谢懿格,中南财经政法大学金融学院
本文编辑:陈梦华
技术总编:李婷婷
Stata&Python云端课程来啦!
好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
自5月4日起,我们的公众号开始为大家介绍诸多Stata17的新功能,在今天的推文中,小编会带各位看一下Stata17在日期时间方面有哪些更新。
之前有不少关于日期时间的推文让我们了解了日期时间的内容,例如《日期数据处理》、《字符型日期与数值型日期处理》、《有问必答|如何从tc格式的日期中提取年份信息》、以及《日期函数大汇总(一)》等。Stata17在日期时间方面新增了一系列函数用以计算两个日期间隔的时间、提取时间的年月日成分等。接下来我们来看一下如何使用这些函数。
datediff、datediff_frac函数
datediff(e_d1,e_d2,s_u,s_nl) | 计算e_d1和e_d2两个日期间隔多长时间(Stata会将结果向下取整数)。 其中, |
---|---|
datediff_frac(e_d1,e_d2,s_u,s_nl) | 输出结果包含小数部分 |
s_u | 规定间隔时间的单位,"day"或"d"指天,"month"或"mon"或"m"指月,"year"或"y"指年。 |
s_nl | 指定闰年的2月29日在平年中对应哪一天。"01mar"(默认值)对应平年3月1日;"28feb"对应平年2月28日。 |
我们任意输入两个e_d型日期,计算时间间隔:
clear
input date1 date2
12345 13456
end
gen date3 = date1
gen date4 = date2
format date3 date4 %tdCY-N-D
gen daydiff = datediff(date1, date2, "d")
gen monthdiff = datediff(date1, date2, "mon")
gen yeardiff = datediff(date1, date2, "y")
gen daydiff1 = datediff_frac(date1, date2, "d")
gen monthdiff1 = datediff_frac(date1, date2, "mon")
gen yeardiff1 = datediff_frac(date1, date2, "y")
以上是两个日期的时间间隔的计算,接下来我们看一下如何计算两个时间之间间隔多久——clockdiff、clockdiff_frac、Clockdiff、Clockdiff_frac函数。
clockdiff、clockdiff_frac、Clockdiff、Clockdiff_frac函数
clockdiff(e_tc1,e_tc2,s_u) | 计算e_tc1和e_tc2两个时间间隔多久(Stata会将结果向下取整)。其中,clockdiff(e_tc1,e_tc2,s_u) 等于-clockdiff(e_tc2,e_tc1,s_u)) 。 |
---|---|
clockdiff_frac(e_tc1,e_tc2,s_u) | 输出结果包含小数部分 |
Clockdiff(e_tC1,e_tC2,s_u) | 对时间的计算考虑闰秒,输出结果向下取整。 |
Clockdiff_frac(e_tC1,e_tC2,s_u) | 对时间的计算考虑闰秒,输出结果包含小数部分 |
s_u | 规定间隔时间的单位,"day"或"d"指天,"hour"或"h"指小时,"minute"或"min"或"m"指分钟,"second"或"sec"或"s"指秒,"millisecond"或"ms"指毫秒。 |
其中闰秒,就是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒)。
我们任意输入两个e_tc型时间,计算这两个时间间隔多久:
clear
input time1 time2
1234567890123 1234987659876 //Stata时间是一个数字,表示从01jan1960 00:00:00.000开始的毫秒数
end
gen time3 = time1
gen time4 = time2
format time3 time4 %tcCCYY-NN-DD_HH:MM:SS //把e_tc型时间转成CCYY-NN-DD_HH:MM:SS的格式。
gen ddiff = clockdiff(time1, time2, "d")
gen hdiff = clockdiff(time1, time2, "h")
gen mindiff = clockdiff(time1, time2, "min")
gen secdiff = clockdiff(time1, time2, "s")
gen msdiff = clockdiff(time1, time2, "ms")
我们也可以用clockdiff_frac()来计算包含小数部分的结果,运行如下:
gen ddiff1 = clockdiff_frac(time3, time4, "day")
gen hdiff1 = clockdiff_frac(time3, time4, "hour")
gen mindiff1 = clockdiff_frac(time3, time4, "minute")
gen secdiff1 = clockdiff_frac(time3, time4, "second")
gen msdiff1 = clockdiff_frac(time3, time4, "millisecond")
关于年龄的计算——age函数
age(e_{dDOB},e_d[,s_nl]) | 给定出生日期e_{dDOB},计算在e_d这天的年龄。这两个日期均为Stata型日期。 |
---|---|
s_nl | 指定一个在闰年2月29日出生的人,在平年的生日是哪一天。"01mar"(默认值)指生日为平年3月1日;"28feb"指生日为平年2月28日。 |
Stata计算一个人的年龄同样是按照计算两个日期之间时间间隔的方式,这点和datediff()函数没有太大不同。在此我们考虑一种特殊情形:一个在闰年2月29日出生的人,在平年是哪一天过生日呢?我们以2000年2月29日出生的人为例,计算他/她在平年2月28日应该是几岁:
clear
set obs 1
*用td()函数将DDmonCCYY形式的日期转成e_d日期
gen age1 = age(td(29feb2000), td(28feb2021), "01mar")
gen age2 = age(td(29feb2000), td(28feb2021), "28feb")
*用mdy函数将MDY日期转成e_d形式
gen age3 = age(mdy(02,29,2000), mdy(02,28,2021), "01mar")
gen age4 = age(mdy(02,29,2000), mdy(02,28,2021), "28feb")
在介绍这三个函数之前,我们先介绍Stata17新增的用以输出当前日期和当前时间的函数——today()和now()。在Stata17之前,我们可以用c类返回值c(current_date)和c(current_time)来返回当前日期和当前时间。下图展示了两类函数的运行结果:
datepart()函数介绍如下:
datepart(e_d,s_u) | 输出e_d日期的年、月、日 |
---|---|
s_u | 规定提取的部分,"day"或"d"指天,"month"或"mon"或"m"指月份,"year"或"y"指年份。 |
我们看一下如何提取当前这一天的的年月日:
clear
set obs 1
gen today1 = today()
gen today2 = today1
format today2 %tdCY-N-D
*Stata17之前提取日期年月日的方法——year、month、day函数
gen year = year(today1)
gen month = month(today1)
gen day = day(today1)
*Stata17新功能——datepart函数提取日期年月日
gen year1 = datepart(today1, "y")
gen month1 = datepart(today1, "m")
gen day1 = datepart(today1, "d")
相似地,Stata17还新出了clockpart()和Clockpart()来提取Stata时间中的年、月、日、小时、分钟、秒、毫秒,这两个函数的介绍如下:
clockpart(e_tc,s_u) | 输出Stata时间e_tc的年、月、日、小时、分钟、秒、毫秒。e_tc是不考虑闰秒的Stata时间。 |
---|---|
Clockpart(e_tC,s_u) | 输出Stata时间e_tC的年、月、日、小时、分钟、秒、毫秒。e_tC是考虑闰秒的Stata时间。 |
s_u | 规定提取的部分,"year"或"y"指年份,"month"或"mon"或"m"指月份,"day"或"d"指天,"hour"或"h"指小时,"minute"或"min"指分钟、"second"或"sec"或"s"指秒,"millisecond"或"ms"指毫秒。 |
由于year(), quarter(), month(), week(), day(), dow()函数括号内要求的是e_d格式的日期,所以Stata17之前提取e_tc型时间各成分的方法,是先用函数dofc(e_tc),将e_tc时间转成e_d日期,再用这些函数来提取。而Stata17新函数——clockpart()和Clockpart(),则允许我们直接从e_tc格式中提取。我们以当前时间为例,来提取各时间成分:
clear
set obs 1
gen now1 = now()
gen now2 = now1
format now2 %tcDD-NN-CCYY_HH:MM
*不考虑闰秒,用clockpart函数提取时间成分
gen year = clockpart(now1, "y")
gen month = clockpart(now1, "mon")
gen day = clockpart(now1, "d")
gen hour = clockpart(now1, "h")
gen minute = clockpart(now1, "min")
gen second = clockpart(now1, "s")
gen millisecond = clockpart(now1, "ms")
*考虑闰秒,用Clockpart函数提取分、秒、毫秒
gen Minute = Clockpart(now1, "min")
gen Second = Clockpart(now1, "s")
gen Millisecond = Clockpart(now1, "ms")
我们发现,Clockpart()计算的秒数(Second)比用clockpart()计算的秒数(second)少,这是由于闰秒的调整。
birthday函数
birthday(e_{dDOB},Y[,s_nl]) | 给定出生日期e_{dDOB},输出在Y年的生日日期。这两个日期均为Stata日期。 |
---|---|
s_nl | 可选项,指定一个在闰年2月29日出生的人,在平年的生日是哪一天。"01mar"(默认值)为平年3月1日;"28feb"为平年2月28日。 |
我们来计算一个2000年10月1日出生的人,在2021年的生日距离1960年1月1日有几天:
daysinmonth、firstdayofmonth、lastdayofmonth函数
daysinmonth(e_d) | 输出Stata日期e_d所处月份的天数 |
---|---|
firstdayofmonth(e_d) | 输出Stata日期e_d所处月份的第一天,以Stata日期的形式 |
lastdayofmonth(e_d) | 输出Stata日期e_d所处月份的最后一天,以Stata日期的形式 |
我们以当前日期为例,分别计算当前月份的天数,以及这个月第一天和最后一天的Stata日期:
isleapyear、previousleapyear、nextleapyear函数
isleapyear(Y) | 判断年份Y是否为闰年,是则输出1,否则输出0 |
---|---|
previousleapyear(Y) | 输出年份Y的上一个闰年 |
nextleapyear(Y) | 输出年份Y的下一个闰年 |
我们来判断一下2021年和2020年是不是闰年,以及2021年的上一个闰年和下一个闰年分别是什么时间:
以上就是Stata17有关日期时间方面的更新,thank you for your support~ Wish you all the best and have a nice day :)
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》 数据可视化利器——Matplotlib从第七次人口普查看中国人口变化|Stata与Python交互绘图
200万投资者关注!!哪家公司这么牛?
带你领略一天天气之变化
利用pyecharts看微博粉丝地区分布
零值太多怎么办?解锁Stata17新命令ziologit
Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 初识PyStata
辞旧迎新——Stata17之Do-file编辑器优化
Stata17新亮点——解放表格输出生产力
【爬虫+可视化】链家网北京租房信息
手把手教你如何获取股票数据和可视化
Countvalues——数数的超级小帮手
下拉选择框如何变成“小猫咪” | selenium小技巧
Python中的运算符知多少?
快来get缺失值的正确打开方式
frame框架——我到底在哪个“房间”如何使用Pandas读取txt文件?
基于MySQL数据库实现增量式爬取
寻找春日气息|本月最受欢迎的景点都在这里!
问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!
Python与数据库交互—浅述pymysql
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。