在Stata转换字符串每月日期

时间:2016-04-23 15:17:57

标签: date csv 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

v1的形式是dd / mm / yyyy。

我使用import delimited ...file.csv

在Stata中导入文件

v1是一个字符串变量,v2是一个浮点数。

我想在Stata可以读取的每月日期转换v1。

我的尝试:

1)

gen Time = date(v1, "DMY")
format Time %tm

给了我

Time
3177m7
3180m2
3182m7
...

看起来不对。

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

给出完全相同的结果。

如果我输入

tsset Time, format(%tm)

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

你能帮助我理解我做错了吗?

1 个答案:

答案 0 :(得分:4)

Stata在日期和时间上有wonderful documentation,如果您计划使用与时间相关的变量,则应该从头到尾阅读。阅读本文档不仅可以解决您当前的问题,还可以防止将来出现代价高昂的错误。与您的问题相关的部分标题为“SIF到SIF转换”。 SIF的意思是“Stata内部形式。”

解释您当前的问题:

Stata将日期存储为数字;在指定格式时将它们解释为“日期”。请考虑以下事项:

dependencies=Component

为日期分配值15706.让我们将其格式化为一天:

set obs 1
gen dt = date("01/01/2003", "DMY")
list dt
// 15706

现在让我们将其格式化为一个月:

format dt %td
list
// 01jan2003

请注意,format dt %tm list // 3268m11 只是一个可以格式化和使用的数字,如一天或一个月。要从“日期编号”获取“月份编号”,请执行以下操作:

dt

变量gen mt = mofd(dt) // mofd = month of day format mt %tm list // dt mt // 3268m11 2003m1 现在等于516. 2003年1月是从1960年1月起的516个月.Stata的“纪元时间”是1960年1月1日00:00:00.000。日期变量存储为自纪元时间以来的天数,日期时间变量存储为自纪元时间以来的毫秒数。月份变量可以存储为自纪元时间以来的月份(mt格式确定要显示的月份)。