stata:时间变量格式转换_弘略的博客-程序员秘密

技术标签: 时间序列  时间变量  stata  数据整理  数据清洗  

stata:时间变量格式转换

时间序列是经济金融类研究最常用的数据类型,时间变量的转换和设定一般是初学者最为头大的问题,本文在这里详尽的展示有关时间变量处理、转换以及格式设定的相关问题,话不多说直奔主题。
第一次使用MarkDown,很多细节问题不是很懂,格式有错乱问题,看官多见谅!

1.时间变量格式问题

格式 描述 -1 0 1
%tc 秒 31dec195923:59:59.999 31dec195900:00:00.000 31dec195900:00:00.001
%td 31-Dec-59 01jan1960, Jan-60
%tw 1959w12 1960w1 1960w2
%tm 12, 1
%tq 季度 1959q4 1960q1 1960q2
%th 半年 1959h2 1960h1 1960h2
其他格式
%ty 最小值为100 基期为0 最大值为9999
%tg 整数 -1 0 1

2.由其他变量转为时间变量

一般导入stata的时间变量都是字符型,需要将其转化为stata可识别的时间变量
此时一般用**date() daily() weekly() monthly quarterly()**等函数将其直接转化为数值型时间变量。

由数值变量转换 由字符变量转换 mask
%tc mdyhms(M, D, Y, h, m, s) clock(string, mask [, topyear])
dhms(td, h, m, s) Clock(string, mask [, topyear])
%tC hms(h, m, s)
Cmdyhms(M,D, Y, h, m, s)
Cdhms(td, h, m, s)
Chms(h, m, s)
%td mdy(month, day, year) date(string, mask [, topyear]) Y、M、D的6种组合
%tw yw(year, week) weekly(string, mask [, topyear]) YW WY
%tm ym(year month) monthly(string, mask [, topyear]) YM MY
%tq yq(year, quarter) quarterly(string, mask [, topyear]) YQ QY
%th yh(year, harlyear) harfyearly(string, mask [, topyear]) H
%ty year yearly(string, mask [, topyear]) Y

备注
如果时间字符的形式为“1975/12/27”,对应的形式为年月日,YMD,如果顺序发生了改变,后面的mask也对应调整即可。
如果时间字符中有 “-”,"/",“jul"等字符的时候,上述函数可以直接识别,如果不能识别的情况,如表所示:此时上述函数将会失效,通过以下几种方法处理
方法一:利用subinstr()函数将"年”“月"等字符替换为”-""/“等字符,转换为var1和var2的形式,然后即可利用上述函数处理。
方法二:利用split()函数,在"年”"月"处分开,变成year和month,然后利用日期合成函数进行合成。
方法三:利用substr()函数分别提取前对应的年和月,然后利用日期合成函数
方法四:修改数据原始文件中,修改显示格式,然后重新读取。
方法五:直接正则表达式函数,进行提取或者替换。

timevar var1 var2 year month
2018年7月 Jul-18 Jul-18 2018 7
2018年8月 Aug-18 Aug-18 2018 8
2018年9月 Sep-18 Sep-18 2018 9
2018年10月 Oct-18 Oct-18 2018 10
2018年11月 Nov-18 Nov-18 2018 11
2018年12月 Dec-18 Dec-18 2018 12

3.Mask类型

mask设定日期和时间变量的顺序,比如年-月-日或是 日-月-年等。各个命令允许的mask为下列代码的各种组合。

Clock、clock、date Weekly、monthly、quarterly、 harf yearly
Y 年份(4位数) Y
19Y 年份(2位数,代表19*年) 19Y
20Y 年份(2位数,代表20*年) 20Y
D 日期 W
h 小时 M
m 分钟 Q
s H

4.直接生成时间变量

如生成季度时间变量和月度时间变量
egen qdate=seq(), from(143) to(162),但是这种方式不好用,需要提前知道基期的时间流逝数量,所以非常不方便。以下是常用的方式:
gen qdate=tq(1995q4)+_n-1
gen mdate=tm(1998m1)+_n-1
tsset mdate, monthly

格式 命令 例子
%tc tc([day-month-year] hh:mm[:ss[.sss]]) tc(15jun2004 12:00:00)
%tC 同%tc。 tC(15jun2004 12:00:00)
%td td(day-month-Year) td(15feb1998),d()
%tw tw(Year-week) tw(1998w7),w(2002-25)
%tm tm(Year-month) tm(12),m(2002-6)
%tq tq(Year-quarter) tq(1998q3),q(2002-3)
%th th(Year-harf)或者Year th(1998h1),h(2002-1)
%ty ty(Year)或者Year 1998
%tg ty(integer)或者integer 200

5.时间序列的定义

将时间变量设定为stata能够识别顺序的时间序列
tsset timevar, options
optiongs可以根据时间类型选取不同的选项
如:clocktime, daily, weekly, monthly, quarterly, harfyearly, yearly, generic
如果是面板数据命令为:xtset panlevar timevar, options

6.提取时间成分

从时间变量中提取对应的年、月、日、周、季度等时间元素。
但是该系列函数只能对完整年月日形式的时间变量(日期)进行操作,其他形式的时间变量(如年月)需要转化为年月日的形式方可进行操作。

函数 说明 例子(date=td(5Jul1972))
year(date) 返回年份(四位数) 1972
harfyear(date) 返回半年数:1,2 2
quarter(date) 返回季度:1,2,3,4 3
month(date) 返回月份:1,2,3,…,12 7
week(date) 返回周数:1,…,52 27
day(date) 返回月内的日期:1,…,31 5
dow(date) 返回周内日期:0(星期日),1,2,…,6 3
doy(date) 返回年内的日期:1,…,366 187

7.根据时间成分合成完整的时间变量(提取时间成分的逆向操作)

已知时间变量的成分,可以对应合成相应的时间变量。
如,已知年Y,月M,可以根据ym(Y,M)合成时间变量

函数 时间成分
ym(Y ,M ) Y,M
mdy(M ,D,Y ) Y,M,D
yq(Y,Q) Y,Q
yw(Y,W) Y,W
yh(Y ,H ) Y ,H
mdyhms(M ,D,Y ,h,m,s) Y,M,D,h,m,s
dhms(e d ,h,m,s) date,h,m,s
hms(h,m,s) h,m,s
Cmdyhms(M ,D,Y ,h,m,s) date,h,m,s

8.时间序列频率的转换

转换的核心是将不同频率的数据通过中间日期变量(年月日形式)进行转换。
如月m转化为周w,其思想是先将月m转化(dofm(m))为日d,然后在d的基础上在转化wofd(d)=wofd(dofm(m))为周w。

输出
输入 %td %tw %tm %tq %th %ty
%td wofd() mofd(d) qofd(d) hofd(d) yofd(d)
%tw dofw(w) mofd(dofw(w)) qofd(dofw(w)) hofd(dofw(w)) yofd(dofw(w))
%tm dofm(m) wofd(dofm(m)) qofd(dofm(m)) hofd(dofm(m)) yofd(dofm(m))
%tq dofq(q) wofd(dofq(q)) mofd(dofq(q)) hofd(dofq(q)) yofd(dofq(q))
%th dofh(q) wofd(dofh(q)) mofd(dofh(q)) qofd(dofh(q)) yofd(dofh(q))
%ty dofy(q) wofd(dofy(q)) mofd(dofy(q)) qofd(dofy(q)) hofd(dofy(q))

9.时间变量显示格式

时间序列格式格式设定
日期的显示格式 %d (%td) 定义如下:
%[-][t]d<描述特定的显示格式>
具体项目释义:
“<描述特定的显示格式>”中可包含如下字母或字符
c y m l n d j h q w _ . , : - / ’ !c
C Y M L N D J W
定义如下:

参数 说明
c and C 世纪值(个位数不附加/附加0)
y and Y 不含世纪值的年份(个位数不附加/附加0)
m 三个英文字母的月份简写(第一个字母大写)
M 英文字母拼写的月份(第一个字母大写)
n and N 数字月份(个位数不附加/附加0)
d and D 一个月中的第几日(个位数不附加/附加0)
j and J 一年中的第几日(个位数不附加/附加0)
h 一年中的第几半年 (1 or 2)
q 一年中的第几季度 (1, 2, 3, or 4)
w and W 一年中的第几周(个位数不附加/附加0)
_ display a blank (空格)
. display a period(句号)
, display a comma(逗号)
: display a colon(冒号)
- display a dash (短线)
/ display a slash(斜线)
display a close single quote(右引号)
!c display character c (code !! to display an exclamation point)

样式1:

格式 例子
%td 7-Jul-48
%tdM_d,_CY July7,1948
%tdY/M/D 1948/7/11
%tdM-D-CY 07-11-1948
%tqCY.q 1999.2
%tqCY:q 1992:02:00
%tqCCYY-q 1992-02
%tq 1992q2
%twCY,_w 2010,48

样式2

格式 例子
%d 11-Jul-48
%dDlCY 11-Jul-48
%dDlY 11-Jul-48
%dM_d,_CY July11,1948
%dd_M_CY 11-Jul-48
%dN/D/Y 07/11/48
%dD/N/Y 11/07/48
%dY/N/D 1948/7/11
%dN-D-CY 07-11-1948

** 目前我个人常用的是%tdCCYY-NN-DD 可以等价于 %tdCY-N-D,常用的还有%tdCCYY/NN/DD,也可以根据个人的偏好进行设定。**

主要参考文献

[1] :王群勇,STATA应用高级培训教程讲义, 南开大学数量经济研究所
[2]:Cameron A C, Trivedi P K. Microeconometrics using stata[J]. Indicator, 2009, 2: 47.
[3]:Rabe-Hesketh S, Everitt B. Handbook of statistical analyses using stata[M]. Chapman and Hall/CRC, 2003.
[4]:连玉君,培训讲义
[5]:陈强. 高级计量经济学及 Stata 应用[M]. 高等教育出版社, 2014.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45448405/article/details/97122910

智能推荐

maven(二)-POM_haoxin963的博客-程序员秘密

一、介绍POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。POM 中可以指定以下配置:项目依赖 插件 执行目标 项目构建 profi...

ELK之-redis(错误,警告)日志使用filebeat收集_IT8421的博客-程序员秘密_redis临时存储错误日志

处理redis日志展示收集redis警告和错误日志即可filebeat include_lines: ["WARNING","ERROR"] include_lines 一个正则表达式的列表,以匹配您希望Filebeat包含的行。Filebeat仅导出与列表中正则表达式匹配的行。默认情况下,导出所有行。 参考:https://www.elastic.co...

RuntimeError: CUDA out of memory._xqlily的博客-程序员秘密

Win10运行环境,python编程语言,运行一个pytorch框架的程序报错 “RuntimeError: CUDA out of memory. Tried to allocate 98.00 MiB (GPU 0; 8.00 GiB total capacity; 4.39 GiB already allocated; 5.27 MiB free; 89.58 MiB cached)”,解决办法: bachsize的参数值减小就解决了,举个例子:这里的主机运行内存是16GB,程序ba...

需要惊人的免费编码教程吗? 订阅这些YouTube频道。_cumian8165的博客-程序员秘密

by Beau Carnes 通过博卡恩斯 需要出色的免费编码教程吗? 订阅这些YouTube频道。 (Want excellent free coding tutorials? Subscribe to these YouTube channels.)There are so many great FREE software tutorials and courses on YouTube...

r语言集成算法详解(超全)_data大柳的博客-程序员秘密_r语言算法

随机森林、GBM、AdaBoost等集成算法的实现、对比及再组合提升

博百优,恶心的的柳城,通过自己的插件挂黑链_weixin_30487201的博客-程序员秘密

最近耗子发现自己的网站地图里的最下方多了一个博百优的链接,当时感觉很奇怪,难道被人黑了?但自己的服务器是linux的,策略做得很好,应该没那么容易被黑吧!后来查看了一下这个博百优的链接,指向的正是插件作者的自己网站,这才恍然大悟,这个B在自己开发的插件中留后门了。这B开发的插件名字叫baidu-sitemap-generator,一直在大家心目中的口碑都不错,评分接近满分。这是插件的源代码,里...

随便推点

DeepChem手册3.14 Model类_lishaoan77的博客-程序员秘密

3.14 Model类DeepChem 维护大量的科学计算模型。 DeepChem’s注重于便于科学应用,所以我们支持不同的机器学习框架 (目前有scikit-learn,xgboost, TensorFlow以及PyTorch) 因为不同的框架或多或少的适合于不同的应用。3.14.1 Model菜单如果你刚开始DeepChem,你可能对该基础感兴趣。模型菜单列出了多种定制的DeepChem模型。注意有些打包如SklearnModel 和 GBDTModel打包了外部的机器学习库不包括在内,但本

tomcat访问webapps静态文件报404_daihai1994的博客-程序员秘密_tomcat访问webapp项目404

tomcat访问webapps静态文件报404原因解决办法原因第一次遇到这种情况,tomcat访问webapps下的静态文件访问不了,也没有配置拦截器查资料说是因为war在tomcat解压的时候,是识别不了,不是自己解压的文件夹。(确实我这个静态文件是后续自己复制过来的文件夹)解决办法在tomcat的配置文件conf/server.xml中加入(在最后加,“/host”的上面加)path:的路径是浏览器访问项目路径端口号后面的地址docBase:是文件在服务器中,实际的路径地址...

阿里微服务架构深度笔记_Java海的博客-程序员秘密_阿里微服务

阿里微服务面试真题这些题,根据我的经验,能刷掉90%的求职者,没有夸张,倒不是因为这些题有多难多刁,是因为大部分的人想不到,不重视!没有经验也没有准备,光靠基础当然答不出来。现在几乎业务快速发展的领域都离不开微服务架构,几个比较典型的代表:像淘宝、支付宝、微信、微博、京东等等一些首页上的应用,都是典型的微服务架构。所以如果想要面试上高级一点的岗位,或者在跳槽大厂时不被问住,那还是劝你深入学习一下微服务,在众多的技术中,微服务算是学习起来比较快速,实用价值也非常大的。想要直接上手微服务,单纯通过网络上杂乱无章

为什么取不到metamask的账号?_weixin_34414196的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

模型评估之A/B测试_cqu_shuai的博客-程序员秘密

参考资料《百面机器学习》为什么进行A/B测试离线评估无法完全消除模型过拟合的影响,因此,得出的离线评估结果无法完全代替线上评估结果;离线评估无法完全还原线上的工程环境。离线评估往往不会考虑线上环境的延迟、数据丢失、标签数据丢失等情况;线上系统的某些商业指标在离线评估中无法计算。例如,上线新的推荐算法,离线评估往往关注的是ROC曲线,P-R曲线等的改进,而线上评估可以全面了解该推荐算法带来的用户点击率、留存时长、PV访问量等的变化。如何进行A/B测试主要手段是进行用户分桶,即

js判断是否是移动端还是PC端_飞啊飞我的骄傲放纵-未来全栈工程师的博客-程序员秘密

function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = false; for (var v = 0; v &lt; Agents.length; v++) { if (userAgen

推荐文章

热门文章

相关标签