【问题标题】:Transform string monthly dates in Stata在Stata中转换字符串每月日期
【发布时间】:2016-04-23 15:17:56
【问题描述】:

我在 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 是一个浮点数。

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

我的尝试:

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)

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

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

【问题讨论】:

    标签: date csv stata


    【解决方案1】:

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

    解释您当前的问题:

    Stata 将日期存储为数字;当您分配格式时,您将它们解释为“日期”。考虑以下几点:

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

    因此,该日期被赋值为 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
    

    变量 mt 现在等于 516。2003 年 1 月是 1960 年 1 月的 516 个月。Stata 的“纪元时间”是 1960 年 1 月 1 日 00:00:00.000。日期变量存储为自纪元时间以来的天数,而日期时间变量存储为自纪元时间以来的毫秒数。月份变量可以存储为自纪元时间以来的月份(这就是 %tm 格式确定显示哪个月份的方式)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多