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

文摘   教育   2024-09-07 22:03   山西  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:2024 空间计量专题
主讲老师:范巧 (兰州大学)
课程时间:2024 年 10 月 2-4 日 (三天)
课程咨询:王老师 18903405450(微信)

 课程特色 · 2024空间计量

👉 一、从“零基础”到“高水平”的课程设计

  • 兼顾基础知识、主流模型与前沿模型
  • 既考虑软件安装、程序编写以及空间权重矩阵设计等 基础知识 讲授,更强调时空面板地理加权回归模型、贝叶斯空间计量模型、矩阵指数模型、空间计量交互模型与空间面板似不相关回归模型等 前沿模型 的传授。

👉 二、“保姆级”的空间计量代码

  • 编写与校准所有模型的MATLAB代码,简化实操环节
  • 模型的估计与检验等 仅按照提供的Excel数据版式 搜集与整理原始数据,即可一次性出结果并作图

👉 三、“最多上新” 的内容体系

  • 新增 矩阵指数模型、短面板空间似不相关模型、空间计量交互模型、贝叶斯空间计量模型等
  • 新增 前沿应用案例,包括空间计量与索洛余值法、随机前沿分析与数据包络分析等的互嵌研究,阐释基于空间计量的产业空间结构优化评价方法。
  • 新增 Dagum空间基尼系数、核密度估计、空间马尔科夫链与空间收敛性等内容,阐释现实研究中对空间收敛性的应用“谬误”。

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

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

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


目录

  • 1. 应用场景

  • 2. 前期准备

    • 2.1 日期设定

    • 2.2 命令一览

    • 2.3 数据准备

  • 3. 识别方法

  • 4. 相关推文



温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

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

  • 专题:数据处理
    • Stata 日期格式转换
    • Stata数据处理:各种求和方式一览
    • Stata:文字型日期格式的转换


🍓 课程推荐:2024 空间计量专题
主讲老师:范巧 (兰州大学)
课程时间:2024 年 10 月 2-4 日 (三天)
课程咨询:王老师 18903405450(微信)


New! Stata 搜索神器:lianxh 和 songbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
  . ssc install lianxh
  . ssc install songbl
👉  使用:
  . lianxh DID 倍分法
  . songbl all



🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章