首页 文章

在R中处理Stata%tw日期

提问于
浏览
3

Stata中的%tw格式具有以下形式:1960w1,其在R中没有等价物 . 因此%tw日期必须进行后处理 .

将.dta文件导入R,日期是一个整数,如1304(而不是1985w5)或1426(而不是1987w23) . 如果是一个简单的时间序列,您可以按如下方式设置开始日期:

ts(df, start= c(1985,5), frequency=52)

另一种可能性是:

as.Date(Camp$date, format= "%Yw%W" , origin = "1985w5")

但如果每一行都不是一个日期,那么你必须转换它 .

包装ISOweek基于ISO-8601,形式为“1985-W05”,不处理Stata%tw .

Lubridate包不适用于此格式 . week()返回日期和1月1日之间发生的完整七天期间的数量加一 . week function

在Stata,任何一年的第1周从1月1日开始,无论是一周中的哪一天 . Stata Documentation on Dates

在R中日期的%W格式中,星期从星期一开始,作为一周的第一天 .

从strptime%V是

一年中的星期为ISO 8601中定义的十进制数(00--53) . 如果包含1月1日的星期(从星期一开始)在新的一年中有四天或更多天,那么它将被视为第1周 . 否则,这是上一年的最后一周,下一周是第1周 . (接受但输入时忽略 . )Strptime

Larmarange在Github上指出Haven doesn't interpret dates properly

月,周,季度和半年是Stata的特定格式,分别为%tm,%tw,%tq和%th . 我不确定R中是否有相应的格式 . 到目前为止,它们是作为整数导入的 .

有没有办法将Stata%tw转换为日期格式R可以理解? Here is an Stata file with dates

2 回答

  • 2

    目前还不完全清楚问题是什么,但与1304相对应的年份和周数是:

    wk <- 1304
    1960 + wk %/% 52 
    ## [1] 1985
    
    wk %% 52 + 1
    ## [1] 5
    

    所以假设一年的第一周是第1周并从1月1日开始,上述周的开始就是这个日期:

    as.Date(paste(1960 + wk %/% 52, 1, 1, sep = "-")) + 7 * (wk %% 52)
    ## [1] "1985-01-29"
    
  • 5

    这不是R代码的答案,但它是对Stata周的评论,不能用于评论 .

    严格地说,Stata中的日期是由显示格式定义的,这些格式使人们可以理解 . Stata中的日期始终是数字变量或标量或宏定义,原点是1960年的第一个实例 . 因此,它最多只是简短地谈论%tw日期等 . 我们可以使用 display 来查看不同日期显示的效果格式:

    . di %td 0
    01jan1960
    
    . di %tw 0
     1960w1
    
    . di %tq 0
    1960q1
    
    . di %td 42
    12feb1960
    
    . di %tw 42
    1960w43
    
    . di %tq 42
    1970q3
    

    上面明确指出的一个细微之处在于改变显示格式不会改变存储的内容,即数值 .

    否则,Stata中的日期不是不同的数据类型;它们只是整数,通过相关的显示格式可以理解为日期 .

    这个问题预先假定用Stata周描述一些每周日期是正确的 . 这似乎不太可能,因为我不知道StataCorp以外的机构使用Stata周规则的情况,不仅第1周总是从1月1日开始,而且第52周总是包括8天或9天,因此有从来没有在一个日历年的53周 .

    因此,您需要上游并找出数据应该是什么 . 如果没有一些解释,我最好的建议是将每年的52周映射到启动它们的日子,即每个日历年的第1天(7)358 .

    Stata周不会将一对一映射到 any 其他用于定义周的方案 .

    更多this article on Stata weeks

相关问题