如何将包含日期的字符串变量转换成Stata可以识别的日期变量?
将作为字符串输入的日期转换为可由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 |
+------------+
日期和格式这两个命令常用于将字符串日期转换为数字日期。在这些函数中,你需要指定“日期-时间”信息在字符串中如何被规定格式。使用大写字母表示日,月和年(如“DMY”),但如果要指定小时,分或秒(如“DMYhms”),则使用小写字母。在下面的语法中,第一个命令实际上产生了新的日期变量,并且将字符串转换为相关日期的正确数字代码(即1960年1月1日到相关日期之间经过的天数)。我们的数据是按日、月、年的顺序排列的,因此我们在日期(...)命令中使用“dmy”(或“DMY”)(有关不同格式的信息,请参见下文)。第二个命令规定了数值的格式,以便当Stata显示日期时,它的形式会便于阅读。注意到,当使用列表和其他一些数据显示命令时,会生成看起来像字符串日期的值,而被Stata储存的实际值是数字。
- 在Stata中的命令是:
gen date2 = date(date,"DMY")
format date2 %td
list
+------------------------+
| date date2 |
|------------------------|
1. | 20jan2007 20jan2007 |
2. | 06sept2001 06sep2001 |
3. | 21june2004 21jun2004 |
4. | 04july2006 04jul2006 |
5. | 6aug2005 06aug2005 |
+------------------------+
上面的日期字符串被规定为日、月、年,而没有字符分隔日期的不同组成部分,但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”
情形三:年份为两位数和四位数的日期,所有两位数的日期不是同一个世纪或来自20和21世纪。
在情形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 |
+--------------------------+
关于我们
- 【Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。
- 公众号推文同步发布于 【简书-Stata连享会】 和 【知乎-连玉君Stata专栏】。可以在简书和知乎中搜索关键词
Stata
或Stata连享会
后关注我们。 - 推文中的相关数据和程序,以及 Markdown 格式原文 可以在 【Stata连享会-码云】 中获取。【Stata连享会-码云】 中还放置了诸多 Stata 资源和程序。如 Stata命令导航 || stata-fundamentals || Propensity-score-matching-in-stata || Stata-Training 等。
Stata连享会推文列表
联系我们
-
欢迎赐稿: 欢迎将您的文章或笔记投稿至
Stata连享会(公众号: StataChina)
,我们会保留您的署名;录用稿件达五篇
以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。 - 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。
- 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
- 联系邮件: StataChina@163.com
往期精彩推文
欢迎加入Stata连享会(公众号: StataChina)
网友评论