哈喽,诸君安。
我是问题:
近日有位朋友问了这么一个问题:有一个变量是tc格式的(例如:31jul2012 15:19:06),为什么用year(date)提取年份信息总是生成一堆missing呢?
首先,我们输入一组数据:
clear
set more off
input date
123456789123
1234567891234
1234567898765
98765432198
end
然后我们将其变为tc格式的日期:
format date %tc
%tc是以DDmonCCYY_HH:MM:SS这样显示的日期格式(如上图date的显示格式),它事实上是一个数字,表示从 01jan1960 00:00:00.000开始的毫秒数。
要解决上述问题我们首先来介绍几个简单的函数:
其指的是把天数转换为相应的年份,这个天数是指从1960年1月1日(1月1日为第0天,1月2日为第1天)起,所经历的天数。例如(1960年为闰年,这一年有366天):
dis year(365)
1960
dis year(366)
1961
因此,year(e_d)是把以天数为单位的变量转换为相应的年份,而tc格式的日期实际上是以毫秒为单位的数字,所以用year(e_d)提取tc格式的年份信息时,year(e_d)则会把这个数字当做天数,当这个数字超过 -679,350 to2,936,549这个范围时,提取的年份信息就变成了missing。
那么如何解决这个问题呢?我们看到上图变量date中是有年份信息的,那么能不能把其先转换为字符型,然后利用字符串函数或者正则表达式提取呢?答案是否定的,因为其本身是一个数值,转换为字符型后,原来DDmonCCYY_HH:MM:SS这样的显示格式将不存在,而变为一个由连续数字组成的字符。如下图所示:
tostring date,replace force
显然,这种方法也是行不通的。
但是,我们可以先把tc格式的日期变为天数,然后再通过year(e_d)函数提取年份信息。这里我们需要用到dofc(e_tc)函数。
dofc(e_tc)是日期函数,它可以把从01jan1960 00:00:00.000起以毫秒为单位的数值,变为从01jan1960起以天数为单位的数值。
gen date1 = dofc(date)
变量date1就是从1960年1月1日起的天数。这样就可以利用year(e_d)函数提取年份信息了。
gen year = year(date1)
这里需要与函数 dofC(e_tC)区分开来,dofC函数是在dofc函数的基础上考虑了闰秒的情况,闰秒就是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒)。比方说1972年6月30日行了正闰秒,1972年7月1日时点上,距离01jan196000:00:00.000为4565*24*60*60*1000=394416000000毫秒,现在我们分别用dofc和dofC函数把毫秒数转换为相应的天数:
dis dofC(394416000000)
4564
dis dofc(394416000000)
4565
可以看到由于在1972年6月30日进行了正闰秒,相当于6月30日多了一秒,所以在转换为天数的时候就发生了差异。
还有一种思路,既然想要得到天数,那么一天等于86400000(24*60*60*1000)毫秒,我们通过这一关系就可以把毫秒转换为天数了,程序如下:
gen date1=int(date/86400000)
然后再通过year(e_d)函数就可以提取到年份信息了。
但是这一方法由于数值较大时会受到科学计数法的影响,造成数据的偏差,还是建议大家使用dofc(e_tc)函数的方法。
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
文字编辑:强宇曦
技术总编:刘贝贝
往期推文推荐:
7.一言不合就用stata写邮件(Outlook/Foxmail)
9.I have a Stata, I have a python
10.I have a Stata, I have a Python之二——pdf转word
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。
欢迎关注爬虫俱乐部
微信扫一扫
关注该公众号