查看原文
其他

Stata17之日期时间新功能

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

本文作者:谢懿格,中南财经政法大学金融学院

本文编辑:陈梦华

技术总编:李婷婷

Stata&Python云端课程来啦!

好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

  自5月4日起,我们的公众号开始为大家介绍诸多Stata17的新功能,在今天的推文中,小编会带各位看一下Stata17在日期时间方面有哪些更新。

  之前有不少关于日期时间的推文让我们了解了日期时间的内容,例如《日期数据处理》《字符型日期与数值型日期处理》《有问必答|如何从tc格式的日期中提取年份信息》、以及《日期函数大汇总(一)》等。Stata17在日期时间方面新增了一系列函数用以计算两个日期间隔的时间、提取时间的年月日成分等。接下来我们来看一下如何使用这些函数。

01 计算日期时间间隔的函数
  • datediff、datediff_frac函数

datediff(e_d1,e_d2,s_u,s_nl)

计算e_d1和e_d2两个日期间隔多长时间(Stata会将结果向下取整数)。

其中,datediff(e_d1,e_d2,s_u,s_nl)等于-datediff(e_d2,e_d1,s_u,s_nl)

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型日期,计算时间间隔:

clearinput date1 date212345 13456endgen date3 = date1gen date4 = date2format date3 date4 %tdCY-N-Dgen daydiff = datediff(date1, date2, "d")gen monthdiff = datediff(date1, date2, "mon")gen yeardiff = datediff(date1, date2, "y")

结果表明:date1和date2相差1111天、36个月、3年。同时可以发现,当不足一整年或整月时,datediff()函数会将结果向下取整。如果我们想得到更加精确的结果,可以用datediff_frac()函数,操作如下:
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型时间,计算这两个时间间隔多久:

clearinput time1 time21234567890123 1234987659876 //Stata时间是一个数字,表示从01jan1960 00:00:00.000开始的毫秒数endgen time3 = time1gen time4 = time2format 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")

我们也可以用Clockdiff()Clockdiff_frac()函数来计算考虑闰秒的情形。限于篇幅,此处不再赘述。
  • 关于年龄的计算——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日应该是几岁:

clearset 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")
首先,在将日期转成e_d格式时,我们可以用td()函数和mdy()函数。我们看到,当我们指定闰年2月29日的人在平年3月1日过生日时,这个人在2021年2月28日还没有过生日,所以依旧是20岁;而当我们指定闰年2月29日的人在平年2月28日过生日时,在2021年2月28日这一天,他/她刚好过生日,所以他是21岁。

02 提取日期时间成分的datepart、Clockpart、clockpart函数

  在介绍这三个函数之前,我们先介绍Stata17新增的用以输出当前日期和当前时间的函数——today()now()。在Stata17之前,我们可以用c类返回值c(current_date)和c(current_time)来返回当前日期和当前时间。下图展示了两类函数的运行结果:  

当前日期:

当前时间:

接下来,我们正式了解一下Stata17新推出的datepart()、Clockpart()、clockpart()函数如何提取时间的年月日。之前的推文向我们介绍了如何用substr函数提取年份和月份(《字符型日期与数值型日期处理》),以及如何用year、quarter、month、week和dow函数提取数值型日期的各部分(《日期数据处理》)。在今天的推文中,我们来看一些新方法。

  datepart()函数介绍如下:

datepart(e_d,s_u)输出e_d日期的年、月、日
s_u规定提取的部分,"day"或"d"指天,"month"或"mon"或"m"指月份,"year"或"y"指年份。

  我们看一下如何提取当前这一天的的年月日:

clearset obs 1gen today1 = today()gen today2 = today1format 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格式中提取。我们以当前时间为例,来提取各时间成分:

clearset obs 1gen now1 = now()gen now2 = now1format 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)少,这是由于闰秒的调整。

03 日期时间其他新函数
  • 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 :)

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐 

 Stata17之Lasso新功能

       爱奇艺视频弹幕爬取之《小舍得》        数据可视化利器——Matplotlib

从第七次人口普查看中国人口变化|Stata与Python交互绘图

 200万投资者关注!!哪家公司这么牛?

 
带你领略一天天气之变化

 利用pyecharts看微博粉丝地区分布

 零值太多怎么办?解锁Stata17新命令ziologit

  Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 
速度大比拼之Stata17有多快?

初识PyStata

辞旧迎新——Stata17之Do-file编辑器优化

Stata17新亮点——解放表格输出生产力

【爬虫+可视化】链家网北京租房信息

 手把手教你如何获取股票数据和可视化

  Countvalues——数数的超级小帮手

         frame框架进阶篇

 下拉选择框如何变成“小猫咪” | selenium小技巧

  Python中的运算符知多少?

  快来get缺失值的正确打开方式

  frame框架——我到底在哪个“房间”

如何使用Pandas读取txt文件?

基于MySQL数据库实现增量式爬取

寻找春日气息|本月最受欢迎的景点都在这里!

问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!

Python与数据库交互—浅述pymysql

关于我们 


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



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

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

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

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