如何将包含日期的字符串变量转换成 Stata 可以识别的日期变量?
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 林佳辉 (中山大学岭南学院)
邮箱: 527937871@qq.com
目录
将作为字符串输入的日期转换为可由 Stata 使用的数字日期相对简单,基于数据输入的格式以及应用的格式是否一致,命令会有所不同。大多数情况下,Stata 可以处理一位或两位数的月份,以及月份的缩写(e.g. Jan, Sept, Sep)或全拼(e.g. January, September)。
你可能遇到麻烦的一个地方是年份的表示和处理。一般来说,Stata 希望找到年份的四位数值,如果你的数据没有以这种方式输入(或者没有以对应的方式输入),Stata 也可以处理,但需要对语法做一些补充,下面一组例子涵盖了许多常见情形,从最简单的情况(其中年份的值全部是四位数)到较复杂的情况(其中年份的值没有以对应的四位数值输入)。
input str10 date
20jan2007
06sept2001
21june2004
04july2006
6aug2005
end
list
+------------+
| date |
|------------|
1. | 20jan2007 |
2. | 06sept2001 |
3. | 21june2004 |
4. | 04july2006 |
5. | 6aug2005 |
+------------+
若使用 browse
命令,可以看到数据窗口中的内容如下 (显示为红色):
日期和格式这两个命令常用于将字符串日期转换为数字日期。在这些函数中,你需要指定 日期-时间 信息在字符串中如何被规定格式:
使用大写字母表示 日、月和年,如 DMY
;如果要进一步指定 小时、分或秒,如 ·DMYhms`,则使用小写字母。
在下面的语法中,第一个命令实际上产生了新的日期变量,并且将字符串转换为相关日期的正确数字代码(即 「1960 年 1 月 1 日」(这是 Stata 中的以「日」为单位的日期的初始日期) 到相关日期之间经过的天数)。我们的数据是按「日月年」的顺序排列的,因此我们在 date()
函数中使用dmy
(或 DMY
)(有关不同格式的信息,请参见下文)。第二个命令规定了数值的格式,以便当 Stata 显示日期时,它的形式会便于阅读。注意到,当使用列表和其他一些数据显示命令时,会生成看起来像字符串日期的值,而被 Stata 储存的实际值是数字。
在 Stata 中的命令是:
gen date2 = date(date,"DMY")
clonevar date3 = date2 // 克隆一个变量,以便对比
format date3 %td // 设定 date3 的显示格式为 %td
browse
数据窗口中呈现的结果如下:
上面的日期字符串被规定为日、月、年,而没有字符分隔日期的不同组成部分,但 Stata 可以处理各种格式和分隔符。例如,我们的数据可能已被列为 20-jan-2007、20/jan/2007 或 20.jan.2007,并且上述命令无需任何更改即可使用。
Stata 也可以处理其中一些条目有分隔符而其他条目没有分隔符的日期。我们还可以改变日期组成部分的顺序,只需要做的更改是告诉 Stata 日期组成部分的字母顺序(如,年、月、日可以使用 YMD
)。日期也可以是全数字,例如,2007 年 1 月 20 日
也可以用 20-1-2007 甚至 20012007 表示,如果输入的所有数字日期都没有分隔符,则必须确保一位数的日分和月份的前面必须带有 0
(如 1 月
用 01
表示)。
上面的例子假设年份的值以四位数的格式列出(如 2004 年),但情况并非总是如此。下面的数据仅列出了两位数的日期,假设已知这些日期来自 20 世纪(如 1907 年)或 21 世纪(如 2007 年),我们可以告诉 Stata 将这些年份视为四位数值。要做到这一点,只要在命令部分的 Y 前面添加“19”或“20”,为 Stata 提供数值出现的顺序,例如,对于以“日月年”方式列出的日期来说,格式为“DM20Y”。在下面的数据中,注意最后两个日期都包含四位数年份(2005 年和 1999 年);这是可以的——唯一的限制是两位数的年份输入都来自同一个世纪。
input str14 date
20jan07
06sept01
21june04
04july06
6august05
6august2005
20june1999
end
list
+-------------+
| date |
|-------------|
1. | 20jan07 |
2. | 06sept01 |
3. | 21june04 |
4. | 04july06 |
5. | 6august05 |
|-------------|
6. | 6august2005 |
7. | 20june1999 |
+-------------+
gen date2 = date(date, "DM20Y")
format date2 %td
list date date2
+-------------------------+
| date date2 |
|-------------------------|
1. | 20jan07 20jan2007 |
2. | 06sept01 06sep2001 |
3. | 21june04 21jun2004 |
4. | 04july06 04jul2006 |
5. | 6august05 06aug2005 |
|-------------------------|
6. | 6august2005 06aug2005 |
7. | 20june1999 20jun1999 |
+-------------------------+
注意 20 世纪的日期(如 1997 年)的格式定义为 DM19Y
。
在情形 2 中,假设了所有具有两位数年份的日期都来自同一世纪,并且所有具有两位数值的年份的日期都在 20 或 21 世纪。在这个例子中,我们将告诉 Stata 数据可能出现的最近一年,Stata 将分配几个世纪,以便所有日期在该年之前发生。这有用的一个例子是,如果我知道下面的数值是当前活着的人的出生日期,由于他们依旧活着,因此我知道他们都不是在这一年(2007)后出生,并且“07”这个值不太可能是 1907 年而不是 2007 年(注意这类信息高度依赖于数据,因此你需要检查所有与你实际了解的数据相违背的假定。如果你的 2 位数年份值都来自早期的世纪,这也会派上用场。例如,如果你的所有日期都是 18 世纪的,那么将 1799 年作为最后一年将会导致所有两位数的日期被分配到十八世纪(即 84 将被解释为 1784)。
输入下面的代码,可以看到
input str18 date
20jan2007
06sept1985
21june04
4july90
9jan1999
6aug99
19august2003
end
list
+--------------+
| date |
|--------------|
1. | 20jan2007 |
2. | 06sept1985 |
3. | 21june04 |
4. | 4july90 |
5. | 9jan1999 |
|--------------|
6. | 6aug99 |
7. | 19august2003 |
+--------------+
从一个字符串变量里创建新的数字日期变量并规定新变量以使其显示为日期的命令是:
gen date2 = date(date, "DMY", 2007)
format date2 %td
list date date2
+--------------------------+
| date date2 |
|--------------------------|
1. | 20jan2007 20jan2007 |
2. | 06sept1985 06sep1985 |
3. | 21june04 21jun2004 |
4. | 4july90 04jul1990 |
5. | 9jan1999 09jan1999 |
|--------------------------|
6. | 6aug99 06aug1999 |
7. | 19august2003 19aug2003 |
+--------------------------+
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1 小时 40 分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles 等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata 数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2 小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD