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.