在 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
创建新变量,这很好,但是可以直接在标量常量上使用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
This paper 重复显示格式的变化只是这样的想法,不会影响存储的值。
我转向 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
创建新变量,这很好,但是可以直接在标量常量上使用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
This paper 重复显示格式的变化只是这样的想法,不会影响存储的值。