Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:周小强 (中南财经政法大学)
邮箱:zhouxiaoqiang1017@163.com
编者按: 本文主要摘译自下文,特此致谢!
Source:Cox, Nicholas J., Stata tip 145: Numbering weeks within months, Stata Journal, 2022(1): 224–230. -PDF-
目录
用户拟生成一个变量来识别某具体日期落在当月的第几周。然而,关于「周」的不同定义,为识别造成了一定的困难。解决这一问题的关键在于厘清「周」是如何界定的,如下给出了关于「周」的三种界定情形:
第一,每月的第一周为当月的第1-7天,第二周为当月的第8-14天,以此类推。
第二,每月的第一周,从当月的第一个星期日开始,第一个星期六结束。第二周从当月的第二个星期日开始,第二个星期六结束。以此类推。
第三,每月的第一周,从当月的第一个星期一开始,第一个星期日结束。第二周从当月的第二个星期一开始,第二个星期日结束。以此类推。
本文的目标在于,对每一种定义,给出识别方案。
在介绍如何识别某个具体日期位于当月的第几周前,可先了解Stata
对于日期的基本设定。在Stata
中,日期(某年某月某日)以整数形式保存,起始日期是1960年1月1日。具体来看,1960年1月1日
在Stata
中被保存为0,1960年1月2日
在Stata
中被保存为1,以此类推。
dis mdy(1,1,1960) //显示具体日期在Stata中对应的整数
0
dis mdy(1,2,1960) //显示具体日期在Stata中对应的整数
1
display mdy(12, 31, 2020) //显示具体日期在Stata中对应的整数
22280
如下为本文在后续会用到的函数或命令。
命令 作用
mdy(月,日,年) 将月、日、年格式的日期换算为整数
%td 整数 将整数转换为日期
ym(年,月) 将年、月
ceil(x) 对参数x向上取整(如x=1.2,则返回2)
mofd(以整数形式保存的日期数据) 将以整数形式保存的日期数据转换为月份数据(此时月份仍以整数形式保存)
本文以2021年1月1日-2021年3月31为例,识别每个具体日期处于当月的第几周。如下为生成的2021年1月1日-2021年3月31日(共90天)的日期数据。其中,变量ddate
表示具体的日期。
clear all
set obs 90 //设定拟生成的观测值个数
generate ddate = mdy(12, 31, 2020) + _n //生成2021年前90天的日期数据(此时的日期数据是以整数形式保存的)
format ddate %td //将整数形式保存的日期数据转换为日、月、年格式
generate mdate = mofd(ddate) //生成月份(此时的月份也是以整数的形式保存)
format mdate %tm //转换为年月格式
list in 1/10 //展示前10行观测值
+--------------------+
| ddate mdate |
|--------------------|
1. | 01jan2021 2021m1 |
2. | 02jan2021 2021m1 |
3. | 03jan2021 2021m1 |
4. | 04jan2021 2021m1 |
5. | 05jan2021 2021m1 |
|--------------------|
6. | 06jan2021 2021m1 |
7. | 07jan2021 2021m1 |
8. | 08jan2021 2021m1 |
9. | 09jan2021 2021m1 |
10. | 10jan2021 2021m1 |
+--------------------+
本部分主要讨论三种关于「周」的定义,并基于每种定义,给出识别的方案。
第一种: 最直接的定义是,每月第一周为当月的第1-7天,第2周是第8-14天,以此类推。
识别思路: 首先,利用函数
day
,识别具体日期位于当月的第几天(命名为变量dayth
);其次,用dayth
除以7
,若能整除,则将商
赋值给变量weekth1
,若不能,则将商+1
赋值给变量weekth1
,变量weekth1
表示的是具体日期位于当月的第几周。具体如下:
generate dayth = day(ddate) //每月的第几天
generate weekth1 = ceil(day/7) //每月的第几周
list in 1/10 //显示前10行观测值
+--------------------------------------+
| ddate mdate dayth weekth1 |
|--------------------------------------|
1. | 01jan2021 2021m1 1 1 |
2. | 02jan2021 2021m1 2 1 |
3. | 03jan2021 2021m1 3 1 |
4. | 04jan2021 2021m1 4 1 |
5. | 05jan2021 2021m1 5 1 |
|--------------------------------------|
6. | 06jan2021 2021m1 6 1 |
7. | 07jan2021 2021m1 7 1 |
8. | 08jan2021 2021m1 8 2 |
9. | 09jan2021 2021m1 9 2 |
1. | 10jan2021 2021m1 10 2 |
+--------------------------------------+
第二种: 每月的第一周,从当月的第一个星期日开始,第一个星期六结束。第二周从当月的第二个星期日开始,第二个星期六结束。以此类推。需要说明的是,按此定义,在第一个星期日前的月初几天会被定义为第0周。
识别思路: 首先, 利用
dow
函数,将具体日期转为星期数据(命名为week
),week=0
表示星期日,week=1~6
,分别表示星期一至星期六。其次, 生成标识星期日的变量sunday
,若对应的日期是星期日,则sunday=1
,否则,sunday=0
。最后, 使用求和命令sum
对变量sunday
进行累计求和,生成变量weekth_2
,该变量也标识了具体日期位于当月的第几周。具体代码如下:
gen week = dow(ddate) //week为0表示星期日,1~6为星期一~星期六
gen sunday = (dow(ddate) == 0) //若为星期日,则sunday=1;否则,sunday =0
bysort mdate: generate weekth_2 = sum(sunday) //按月份累计求和
list ddate mdate sunday weekth_2 in 1/10 //显示前10行观测值
+----------------------------------------+
| ddate mdate sunday weekth_2 |
|----------------------------------------|
1. | 01jan2021 2021m1 0 0 |
2. | 02jan2021 2021m1 0 0 |
3. | 03jan2021 2021m1 1 1 |
4. | 04jan2021 2021m1 0 1 |
5. | 05jan2021 2021m1 0 1 |
|----------------------------------------|
6. | 06jan2021 2021m1 0 1 |
7. | 07jan2021 2021m1 0 1 |
8. | 08jan2021 2021m1 0 1 |
9. | 09jan2021 2021m1 0 1 |
10. | 10jan2021 2021m1 1 2 |
+----------------------------------------+
第三种: 每月的第一周,从当月第一个星期一开始,第一个星期日结束。第二周从当月第二个星期一开始,第二个星期日结束。以此类推。
识别思路: 首先, 利用函数
dow
,将具体日期转为星期数据(命名为week
),week=0
表示星期日,week=1~6
,分别表示星期一至星期六。其次, 生成标识星期一的变量monday
,若对应的日期是星期一,则monday=1
,否则,monday=0
。最后, 使用求和命令sum
对变量monday
进行求和,生成变量weekth_3
,该变量也标识了具体日期位于当月的第几周。具体代码如下:
gen monday = (dow(ddate) == 1) //若为星期一,则monday=1;否则,monday =0
bysort mdate: generate weekth_3 = sum(monday) //识别具体日期位于当月的第几周
list ddate mdate week monday weekth_3 in 1/10
+-----------------------------------------------+
| ddate mdate week monday weekth_3 |
|-----------------------------------------------|
1. | 01jan2021 2021m1 5 0 0 |
2. | 02jan2021 2021m1 6 0 0 |
3. | 03jan2021 2021m1 0 0 0 |
4. | 04jan2021 2021m1 1 1 1 |
5. | 05jan2021 2021m1 2 0 1 |
|-----------------------------------------------|
6. | 06jan2021 2021m1 3 0 1 |
7. | 07jan2021 2021m1 4 0 1 |
8. | 08jan2021 2021m1 5 0 1 |
9. | 09jan2021 2021m1 6 0 1 |
10. | 10jan2021 2021m1 0 0 1 |
+-----------------------------------------------+
Note:产生如下推文列表的 Stata 命令为:
lianxh 日期 求和,m
安装最新版 lianxh 命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh