美文网首页
Stata: 字符型日期变量的转换

Stata: 字符型日期变量的转换

作者: stata连享会 | 来源:发表于2019-03-05 17:18 被阅读16次

作者:林佳辉 (中山大学岭南学院)
(知乎 | 简书 | 码云)

   …… Stata连享会 - 往期精彩推文 ……

如何将包含日期的字符串变量转换成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 现场培训 (初级或高级选其一) 资格。
  • 联系邮件: StataChina@163.com

往期精彩推文

Stata连享会推文列表


欢迎加入Stata连享会(公众号: StataChina)

相关文章

  • Stata: 字符型日期变量的转换

    作者:林佳辉 (中山大学岭南学院)(知乎 | 简书 | 码云)   …… Stata连享会 - 往期精彩推文 ……...

  • A002. Stata中字符型变量生成数值型变量

    Stata中字符型变量生成数值型变量 stata中在将纯字符型变量(如A,B,A1)生成新的数值型变量(只能生成,...

  • 日期对象和字符串之间相互转换

    总结日期对象和字符串之间转换的常用方法 1、获取日期对象的毫秒数用日期变量调用getTime方法,返回Long型 ...

  • 数据类型和运算符(类型转换)

    类型转换 自动类型转换 自动转换规则如下:1、把整数(包括字符型)的变量和值赋值给浮点型变量,不会有太大的变化。2...

  • 用SVM预测火灾森林毁坏面积

    X,Y为坐标位置mon和day均为字符型,做数值型转换,且day为无关变量 因变量area为数值型变量,而对连续型...

  • shell编程基础

    Bash变量 · 在Bash中,变量的默认类型都是字符串型 如果需要要转换,用declare命令 decl...

  • ios日期处理

    目录: 1、字符串转换为日期; 2、时间戳转换为日期; 3、日期转换为字符串 4、获取日期中的年、月、日、时、分、...

  • Stata:文字型日期格式的转换

    作者:Stata连享会 (知乎 | 简书 | 码云) Stata 现场培训报名中 问题背景 导入数据后,日期变量显...

  • JinLou-C++day02

    科学计数法 字符型 (char型) 作用: 字符型变量⽤于显⽰单个字符 C和C++中字符型变量只占⽤1个字节 字符...

  • NSDate与NSString的相互转化

    1.日期转换成字符串 2.字符串转换成日期

网友评论

      本文标题:Stata: 字符型日期变量的转换

      本文链接:https://www.haomeiwen.com/subject/vlpouqtx.html