在 Stata 17 中将重新格式化的字符串显示为四位数年份的问题

Problem with displaying reformatted string into a four-digit year in Stata 17

我转向 Stata 视频“数据管理:如何从 Chuck Huber 存储为字符串的日期创建日期变量”以确保我的日期变量格式正确,但是,我无法获得向我显示重新格式化的变量 (school_year2) 以显示为年份(例如 2018)。

有人可以让我知道我在这里可能遗漏了什么吗?

谢谢,

.做文件

gen school_year2 = date(school_year,"Y")
format %ty school_year2
list school_year school_year2 in 1/10

     +---------------------+
     | school~r   school~2 |
     |---------------------|
  1. |     2016    2.0e+04 |
  2. |     2016    2.0e+04 |
  3. |     2016    2.0e+04 |
  4. |     2016    2.0e+04 |
  5. |     2016    2.0e+04 |
     |---------------------|
  6. |     2016    2.0e+04 |
  7. |     2016    2.0e+04 |
  8. |     2016    2.0e+04 |
  9. |     2016    2.0e+04 |
 10. |     2016    2.0e+04 |
     +---------------------+

。 执行文件结束

基础数据的值仍然是从 1960 年 1 月 1 日开始的天数,因为您正在使用 date() 函数。因此,请保持 %td,因为您在这里使用的是天数,而不是年数。但是你可以决定只显示年份,使用 %tdCCYY C 代表世纪,Y 代表年份。但请记住,基础数据点仍然是 2016 年 1 月 1 日,而不是 2016

clear
input str4 school_year
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
end

gen school_year2 = date(school_year,"Y")
format %tdCCYY school_year2
list school_year school_year2 in 1/10

如果您只想使用年份,则使用 year() 函数从日期中获取年份。下面的示例详细介绍了您可以尝试的步骤。

clear
input str4 school_year
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
"2016"
end

gen school_year2 = date(school_year,"Y")
gen school_year3 = year(school_year2)
format %tdCCYY school_year2
format %ty school_year3
list in 1/10

请注意,在最后一个示例中,所有值对您来说都是一样的。但是第一个变量是一个带有文本“2016”的字符串,第二个是一个日期,存储为从 1960 年 1 月 1 日开始的天数,只显示它的年份值,最后一个是一个数字,从 0 年开始的年数显示为年份(在本例中,如果显示为基础数字,年份将是相同的)。

@TheiceBear 已经解释了要点,但这里讲的故事有点不同,以防有帮助。

这里的谬论是,改变(显示)格式就是格式的改变。它对存储的内容没有影响,即对问题中变量中保存的数据的值没有影响。

你正在使用generate创建新变量,这很好,但是可以直接在标量常量上使用didisplay)看到基本原理。这也是检查对 Stata 规则的理解的好方法。

date() 函数——尽管它的历史名称——用于创建数字每日日期(仅)。如果您告诉 date() 您的输入是一个仅包含年份的字符串,那么它会将 1 月 1 日推算为日期和月份。结果是一个整数,从 1960 年 1 月 1 日的刻度原点开始计算。

. di date("2016", "Y")
20454

. di date("1 Jan 2016", "DMY")
20454

. di date("1 Jan 1960", "DMY")
0

可以肯定的是,很少有人愿意或能够计算出如此大的 20454 是多少,但是您可以指定每日日期显示格式,以便您和代码的读者可以直接看到。

. di %td 20454
01jan2016

为了显示每天的日期(或其中的一部分,例如每月或每年的日期),有许多细微的变化。每日日期的不同格式名称均以 %td.

开头

相反,如果您说值 20454 将使用年格式显示,那么您指的是未来几千年后的 20454 年。 Stata 并不感到困惑,只是它不期望年这样的值,只是向您显示一年四舍五入到 2.0e+04,即 20000。如果您有充分的理由将日期设置为数千年或数百万年未来,日期显示格式可能既不需要也没有帮助。

. di %ty 20454
2.0e+04

This paper 重复显示格式的变化只是这样的想法,不会影响存储的值。