在Stata中转换字符串每月日期

TEX*_*TEX 1 csv date stata

我在 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)

它告诉我存在差距,但数据中没有差距。

你能帮我理解我做错了什么吗?

Chr*_*isP 5

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格式确定显示哪个月份的方式)。