【问题标题】:Convert dates from Stata to R将日期从 Stata 转换为 R
【发布时间】:2018-08-03 12:45:05
【问题描述】:

我很难将整数向量转换为日期。

我已经从 Stata 导入了一个数据集,使用:

> dataire <- read.dta13("~/lcapm_ireland.dta", convert.factors = TRUE,
 generate.factors = FALSE, encoding = "UTF-8", fromEncoding = NULL, 
convert.underscore = FALSE, missing.type = FALSE, convert.dates = TRUE, 
replace.strl = TRUE, add.rownames = FALSE)

我的日期变量是从 2000 年 1 月开始的每月时间序列,格式为“2000-1 月”。

与 R 类似,Stata 将日期处理为整数,但在 1960 年 1 月后期,每月日期的原点为零。因此,当将数据集导入 R 时,我会得到一个日期向量,格式如下:

> c(478, 479, 480, ...)

另外,我的日期变量是:

> class(datem)
[1] "Date"

如何使用as.Date 或其他函数来转换格式为"%Y-%b" 的每月日期变量中的整数时间序列?

【问题讨论】:

    标签: r time stata as.date


    【解决方案1】:

    简短的回答是,你无法得到你想要的。这是因为 在 R 中,数字形式的日期必须包含一天。

    为了在 R 中成功导入 Stata 日期,您首先可以转换相应的 Stata 中的变量从每月到日期时间:

    clear
    set obs 1
    
    generate date = monthly("2000-Jan", "YM")
    
    display %tmCCYY-Mon date
    2000-Jan
    
    display date
    480
    
    replace date = dofm(date)
    
    display %tdCCYY-Mon date
    2000-Jan
    
    display date
    14610
    
    replace date = cofd(date) + tc(00:00:35)
    
    display %tc date
    01jan2000 00:01:40
    
    display %15.0f date
    1262304100352
    

    然后在 R 中,您可以执行以下操作:

    statadatetime <-  1262304100352
    
    rdatetime <- as.POSIXct(statadatetime/1000, origin = "1960-01-01")
    rdatetime
    [1] "2000-01-01 02:01:40 EET"
    
    typeof(rdatetime)
    [1] "double"
    
    rdate <- as.Date(rdatetime)
    rdate
    [1] "2000-01-01"
    
    typeof(rdate)
    [1] "double"
    

    您可以通过以下方式获得所需的年(缩写)月份形式:

    rdate = format(rdate,"%Y-%b")
    [1] "2000-Jan"
    
    typeof(rdate)
    [1] "character"
    

    但是,如您所见,这将改变 rdate 持有的类型 日期。

    尝试将其更改回来:

    rdate <- as.Date(rdate)
    Error in charToDate(x) : 
      character string is not in a standard unambiguous format
    

    【讨论】:

      【解决方案2】:

      这更简单,但你会得到一个日期,1990-03-01。

      您有一个整数列向量 DATE_IN_MONTHS,表示自 Stata 中的时间起源(即 1960-01-01)以来的月份。在 R 中,时间的起源是 1970-01-01。

      使用 lubridate 包可以简单地更改时间的来源,然后添加月份:

      db <- haven::read_dta('StataDatabase.dta') %>%
              dplyr::mutate(., DATE_IN_MONTHS = ymd("1960-01-01") + months(DATE_IN_MONTHS))
      

      现在 db$DATE_IN_MONTHS 包含 c(1990-03-01, 1990-04-01, 1990-05-01,...),其中每个元素都是 R 中的日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 2014-05-27
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多