如何用Stata完成(shui)一篇经济学论文(八):日期转换

这篇在我草稿里放了很久,一直不想写,因为日期和画图不难,但很烦。
首先,我们为什么要转换日期?
数据中的日期只是个摆设时,转化日期不是必要的。 比如你不用画时间为横坐标的图或者回归与日期没有直接关系,当然不用转化日期(多一事不如少一事),或者直接把日期转化为数字类型也行,一般我们日期都是年月日,其实已经可以按大小排序了。
如果要画时间为横坐标的图或者利用时间序列搞事情时,才必须要转化日期。 比如画图,如果直接用数字类型的日期作为横坐标,就会出现问题,因为数字类型我们用的十进制,而日期一个月只有30天,一年只有12个月,所以你数字类型画出来的图就会有间隔,Stata又不知道你这个是按日期来的,这时候就必须转化日期。

日期转换

这里我只讲年月日和季度的转换,因为这两个是最常用的,当然Stata还有很多其他的转换和相应函数,比如通过日期推算周末,以及一年中的第几周之类的,但只要你转化为了日期,这些进一步推算也就很简单了,具体的你们可以要用的时候再去搜索。

  1. 规则字符串日期的转化
    如果数据中的日期是规范的,如"20170309",则可以直接进行转换,使用函数date():
* 语法: gen 新变量名称 = date(被转换变量, 转换类型) *
g newdate = date("20170309", "YMD")

因为我只转换这一个字符串,所以括号里第一个参数是一个字符串,这个地方你们可以替换成字符型变量不用我提醒了吧?后面的参数是告诉Stata,被转换字符串的形式,这里是年(Y year)月(M month)日(D day),如果这个日期代表的是2017年9月3日,那我们后面的参数就应该改为"YDM"。如果你的日期只有年月,那就只加"YM",下面再举两个例子供大家参考:

replace newdate = date("20173004",  "YDM")
replace newdate = date("201705",  "YM")
  1. 包含特殊字符的日期转换
    文章已经证明,像"1975/12/27”,"1975-12-27"以及’1975nov12"可以直接用我们上面那个函数进行转化,软件能识别出来这些间隔符,但我没试过(因为我懒)。如果大家发现不能转换,可以使用前面教过的先用subtr(),split()进行分割,把字符串类型转换为数字类型后,使用:
g date = mdy(month, day, year)
  1. 季度的转化
    有时我们需要季度变量,最好的是日期内直接给你的是"2019q2",我们使用quarterly()函数:
g date = quarterly("2019q2", "yq")
g date = quarterly("2q2019", "qy")

大家应该能猜出来q代表quarter,注意这里字符串中的q一定要存在,而且分隔年份与季度。如果你的数据是月份,但你要得到季度的日期数据,则首先分离出年份与月份,将月份转换成数值型,然后通过if函数进行季度分辨:

g season = 4
replace season = 1 if month<4
replace season = 2 if month>3 & month<7
replace season = 3 if month>6 & month<10
tostring season,replace
g newdate = year + "q" + season

转化为理想字符型后再转化为季度日期。(这只是我个人做法,如果大家有更简便的做法欢迎讨论)

format

当我们转化完日期后会发现,转化完的日期变成了一串谁也不认识的数字:在这里插入图片描述
其实这时已经不影响日期的使用,不过不够美观,特别是画图的时候,就看起来很不严谨,一看就是才开始学写论文的菜鸡(你再骂?),所以我们使用format把这串数字转化为我们能看懂的类型:

* 转化日期类型 *
format %d date
* 转化季度类型 *
format %tq quarterdate

format后紧跟的是我们要转换的类型,最后一个参数是我们被转换的变量,其实转换类型挺多的,因为我们这里只讲了日期与季度,所以只写了这两个,有兴趣大家自己了解嗷!

sort

sort 与日期没有太大关系,与画图有点关系,本来这篇准备顺便把画图讲了,只是没想到写了这么多,所以留到下一章,但sort还是在这一章讲完。sort的意思是排序,不仅仅局限于日期,可以按文字啊、数字啊、字母之类的都能排,跟excel里排序一样,不过这个排出来都是升序:

* 按日期升序排列 *
sort date
* 按日期升序后按名字升序 *
sort date name

可以看到,sort 后可以接多个变量。当然另外一个函数gsort可以升序降序都排:

* 按日期升序排列 *
gsort +date
* 按日期降序排列 *
gsort -date
* 按日期升序后按名字降序 *
sort +date -name

不过我一般用sort,排序而已,大不了从尾到头看数据就是手动降序(狗头),为什么不用gsort?不想多打一个字母…

References
https://blog.csdn.net/ustcjingshan/article/details/97128841
https://www.jianshu.com/p/1c2c91867f80

猜你喜欢

转载自blog.csdn.net/Hedy_mail/article/details/108326213