将日期从 Stata 转换为 R
Convert dates from Stata to R
我在将整数向量转换为日期时遇到困难。
我使用以下方法从 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 中,数字形式的日期必须包括一天。
要在 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
这比较简单,但您会得到一个日期,日期是 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 中的一个日期。
我在将整数向量转换为日期时遇到困难。
我使用以下方法从 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 中,数字形式的日期必须包括一天。
要在 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
这比较简单,但您会得到一个日期,日期是 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 中的一个日期。