转换日期从Stata到R

时间:2018-08-03 12:45:06

标签: r time stata as.date

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

我使用以下方法从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"的整数的时间序列?

2 个答案:

答案 0 :(得分: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"

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

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

答案 1 :(得分:0)

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

您有一个整数列向量 DATE_IN_MONTHS,它是自 1960 年 1 月 1 日在 Stata 中的时间起源以来的几个月。在 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 中的一个日期。