我在 Stata 中的日期格式有问题。我相信这是一个非常简单的问题,但我不知道如何解决它。
我有一个 csv 文件(file.csv),看起来像
v1 v2
01/01/2000 1.1
01/02/2000 1.2
01/03/2000 1.3
...
01/12/2000 1.12
01/02/2001 1.1
...
01/12/2001 1.12
Run Code Online (Sandbox Code Playgroud)
v1 的形式为 dd/mm/yyyy。
我在 Stata 中使用导入文件 import delimited ...file.csv
v1 是一个字符串变量,v2 是一个浮点数。
我想在Stata可以读取的每月日期转换v1 。
我的尝试:
1)
gen Time = date(v1, "DMY")
format Time %tm
Run Code Online (Sandbox Code Playgroud)
这给了我
Time
3177m7
3180m2
3182m7
...
Run Code Online (Sandbox Code Playgroud)
看起来不对。
2)替代
gen v1_1=v1
replace v1_1 = substr(v1_1,4,length(v1_1))
gen Time_1 = date(v1_1, "MY")
format Time_1 %tm
Run Code Online (Sandbox Code Playgroud)
这给出了完全相同的结果。
如果我输入
tsset Time, format(%tm)
Run Code Online (Sandbox Code Playgroud)
它告诉我存在差距,但数据中没有差距。
你能帮我理解我做错了什么吗?
Stata 有关于日期和时间的精彩文档,如果您打算使用与时间相关的变量,您应该从头到尾阅读这些文档。阅读本文档不仅可以解决您当前的问题,还可以防止将来出现代价高昂的错误。与您的问题相关的部分标题为“SIF 到 SIF 的转换”。SIF 的意思是“Stata 内部形式”。
解释您当前的问题:
Stata 将日期存储为数字;当您分配格式时,您将它们解释为“日期”。考虑以下:
set obs 1
gen dt = date("01/01/2003", "DMY")
list dt
// 15706
Run Code Online (Sandbox Code Playgroud)
因此该日期被分配了值 15706。让我们将其格式化为一天:
format dt %td
list
// 01jan2003
Run Code Online (Sandbox Code Playgroud)
现在让我们将其格式化为一个月:
format dt %tm
list
// 3268m11
Run Code Online (Sandbox Code Playgroud)
请注意,这dt
只是一个数字,您可以对其进行格式化和使用,例如日或月。要从“日数”中获取“月数”,请执行以下操作:
gen mt = mofd(dt) // mofd = month of day
format mt %tm
list
// dt mt
// 3268m11 2003m1
Run Code Online (Sandbox Code Playgroud)
变量mt
现在等于 516。2003 年 1 月是从 1960 年 1 月算起的 516 个月。Stata 的“纪元时间”是 1960 年 1 月 1 日 00:00:00.000。日期变量存储为自纪元时间以来的天数,而日期时间变量存储为纪元时间以来的毫秒数。月份变量可以存储为自纪元时间以来的月份(这就是%tm
格式确定显示哪个月份的方式)。