Stata数据处理:一月有几周?月度和周数据转换

发布时间:2022-04-28 阅读 300

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:周小强 (中南财经政法大学)
邮箱zhouxiaoqiang1017@163.com

编者按: 本文主要摘译自下文,特此致谢!

Source:Cox, Nicholas J., Stata tip 145: Numbering weeks within months, Stata Journal, 2022(1): 224–230. -PDF-


目录


1. 应用场景

用户拟生成一个变量来识别某具体日期落在当月的第几周。然而,关于「周」的不同定义,为识别造成了一定的困难。解决这一问题的关键在于厘清「周」是如何界定的,如下给出了关于「周」的三种界定情形:

第一,每月的第一周为当月的第1-7天,第二周为当月的第8-14天,以此类推。

第二,每月的第一周,从当月的第一个星期日开始,第一个星期六结束。第二周从当月的第二个星期日开始,第二个星期六结束。以此类推。

第三,每月的第一周,从当月的第一个星期一开始,第一个星期日结束。第二周从当月的第二个星期一开始,第二个星期日结束。以此类推。

本文的目标在于,对每一种定义,给出识别方案。

2. 前期准备

2.1 日期设定

在介绍如何识别某个具体日期位于当月的第几周前,可先了解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

2.2 命令一览

如下为本文在后续会用到的函数或命令。

命令	                    作用
mdy(月,日,年)                 将月、日、年格式的日期换算为整数  
%td 整数                      将整数转换为日期
ym(年,月)                     将年、月
ceil(x)                      对参数x向上取整(如x=1.2,则返回2)
mofd(以整数形式保存的日期数据)  将以整数形式保存的日期数据转换为月份数据(此时月份仍以整数形式保存)  

2.3 数据准备

本文以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 |
     +--------------------+

3. 识别方法

本部分主要讨论三种关于「周」的定义,并基于每种定义,给出识别的方案。

第一种: 最直接的定义是,每月第一周为当月的第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 |
     +-----------------------------------------------+

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
    lianxh 日期 求和,m
安装最新版 lianxh 命令:
   ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh