Stata数据处理:字符型日期变量的转换

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

🎦 效率分析 · 进阶 最新模型和工具
📅 2021 年 11 月 13-14;20-21 日
🔑 张宁教授 (山东大学);杜克锐副教授 (厦门大学)
🍓 课程主页https://gitee.com/lianxh/TE

实现经济增长的途径主要有两个:一是增加投入,二是提高效率。后者不仅能增加经济总量,还能提升经济质量。因此,效率分析是经济学研究中的核心。

显然,若想发表高水平的论文,就必须紧跟前沿,引领趋势,这正是本期「效率分析·进阶班」课程的主旨。

张宁教授在环境效率和非期望产出领域学者中排名第二,他在 Science, Nature, Cell 和 Lancet 上均有发表。杜克锐副教授已在 SSC 发布了十余个 Stata 命令,有三篇论文发表于 Stata Journal,获得 2020 年 Stata 中国用户奖。

课程包括参数方法和非参数方法两个部分:

  • 参数方法主要包括参数线性规划(Parametric LP)、计量经济方法和随机前沿方法(SFA)三大方法。
  • 非参数方法,即 DEA 方法,主要包括 DDF, NDDF 和 SBM 等模型。


重要福利: 本课程所涉及的参数和非参数效率模型,老师们都将会提供封装后的 Stata 估计命令,只需几条简单的命令即可实现最新的模型。老师们也会分享编写过程心得,让大家有能力对这些封装程序进行修改和扩展。

扫码直达课程主页:

作者: 林佳辉 (中山大学岭南学院)
邮箱: 527937871@qq.com


目录

  • 情形一:带有四位数值年份的日期

  • 情形二:年份为两位数和四位数的日期,同一世纪的所有两位数日期

  • 情形三:年份为两位数和四位数的日期,所有两位数的日期不是同一个世纪或来自 20 和 21 世纪


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

将作为字符串输入的日期转换为可由 Stata 使用的数字日期相对简单,基于数据输入的格式以及应用的格式是否一致,命令会有所不同。大多数情况下,Stata 可以处理一位或两位数的月份,以及月份的缩写(e.g. Jan, Sept, Sep)或全拼(e.g. January, September)。

你可能遇到麻烦的一个地方是年份的表示和处理。一般来说,Stata 希望找到年份的四位数值,如果你的数据没有以这种方式输入(或者没有以对应的方式输入),Stata 也可以处理,但需要对语法做一些补充,下面一组例子涵盖了许多常见情形,从最简单的情况(其中年份的值全部是四位数)到较复杂的情况(其中年份的值没有以对应的四位数值输入)。

情形一:带有四位数值年份的日期

input str10 date20jan200706sept200121june200404july20066aug2005endlist

     +------------+     |       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-200720/jan/200720.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 date20jan0706sept0121june0404july066august056august200520june1999endlist

     +-------------+     |        date |     |-------------|  1. |     20jan07 |  2. |    06sept01 |  3. |    21june04 |  4. |    04july06 |  5. |   6august05 |     |-------------|  6. | 6august2005 |  7. |  20june1999 |     +-------------+
  • 从一个字符串变量里创建新的数字日期变量并规定新变量以使其显示为日期的命令是:
gen date2 = date(date, "DM20Y")format date2 %tdlist 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 date20jan200706sept198521june044july909jan19996aug9919august2003endlist

     +--------------+     |         date |     |--------------|  1. |    20jan2007 |  2. |   06sept1985 |  3. |     21june04 |  4. |      4july90 |  5. |     9jan1999 |     |--------------|  6. |       6aug99 |  7. | 19august2003 |     +--------------+

从一个字符串变量里创建新的数字日期变量并规定新变量以使其显示为日期的命令是:

gen date2 = date(date, "DMY", 2007)format date2 %tdlist 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 |     +--------------------------+

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

🍏 关于我们

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

相关推荐