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



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

有人能告诉我这里可能缺少什么吗?

谢谢你,

.do文件

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 |
+---------------------+

do文件结束

使用date()函数时,基础数据的值仍然是从1960年1月1日起的天数。所以保持%td,因为你在这里工作的是天,而不是年。但您可以决定只显示年份,使用代表世纪的%tdCCYYC和代表年份的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来创建新的变量,这很好,但可以直接使用标量常数上的di(display(来查看基本原理。这也是检查对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

这篇论文重复了这样一种观点,即显示格式的更改只是这样,不会影响存储值。

最新更新