时间序列是经济金融类研究最常用的数据类型,时间变量的转换和设定一般是初学者最为头大的问题,本文在这里详尽的展示有关时间变量处理、转换以及格式设定的相关问题,话不多说直奔主题。
第一次使用MarkDown,很多细节问题不是很懂,格式有错乱问题,看官多见谅!
格式 | 描述 | -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 |
一般导入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 |
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 |
如生成季度时间变量和月度时间变量
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 |
将时间变量设定为stata能够识别顺序的时间序列
tsset timevar, options
optiongs可以根据时间类型选取不同的选项
如:clocktime, daily, weekly, monthly, quarterly, harfyearly, yearly, generic
如果是面板数据命令为:xtset panlevar timevar, options
从时间变量中提取对应的年、月、日、周、季度等时间元素。
但是该系列函数只能对完整年月日形式的时间变量(日期)进行操作,其他形式的时间变量(如年月)需要转化为年月日的形式方可进行操作。
函数 | 说明 | 例子(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 |
已知时间变量的成分,可以对应合成相应的时间变量。
如,已知年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 |
转换的核心是将不同频率的数据通过中间日期变量(年月日形式)进行转换。
如月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)) |
时间序列格式格式设定
日期的显示格式 %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) |
格式 | 例子 |
---|---|
%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 |
格式 | 例子 |
---|---|
%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.