我在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
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)
它告诉我存在差距但数据中没有间隙。
你能帮助我理解我做错了吗?
答案 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
格式确定要显示的月份)。