我在R数据帧列中有日期,格式为字符串WK01Q32014
。
我想将每个日期转换为Date()
对象。
所以我改变了格式,使其看起来像01-3-2014
。我想尝试做一些像as.Date("01-3-2014","%W-%Q-%Y")
这样的事情,但是我所知道的季度没有格式代码。
有没有办法使用lubridate
,zoo
或任何其他库来执行此操作?
答案 0 :(得分:1)
我不知道任何具体的功能,但这是一个基本功能:
convert_WQ_to_Date <- function(D) {
weeks <- as.integer(substr(D, 3, 4))
quarter <- as.integer(substr(D, 6, 6))
year <- substr(D, 7, 10)
days <- 7 * ((quarter - 1) * 13 + (weeks-1))
as.Date(sprintf("%s-01-01", year)) + days
}
实施例
D <- c("WK01Q32014", "WK01Q12014", "WK05Q42014", "WK01Q22014", "WK02Q32014")
convert_WQ_to_Date(D)
[1] "2014-07-02" "2014-01-01" "2014-10-29" "2014-04-02" "2014-07-09"
答案 1 :(得分:1)
周,季度和年份并不唯一地定义日期,因此我们必须添加一些假设。在这里,我们假设第一周是第一周的第一周,第二周是第7天,依此类推,
下面,我们提取qtr-year部分并在zoo包中使用as.yearqtr
将其转换为yearqtr
对象,然后使用as.Date
将其转换为日期本季度的第一季。然后我们提取周,减去1并乘以7得到天数偏移。将第四个季度添加到偏移量会得到结果:
library(zoo)
xx <- "01-3-2014" # week-quarter-year
qtr.start <- as.Date(as.yearqtr(sub("...", "", xx), "%q-%Y"))
days <- 7 * (as.numeric(sub("-.*", "", xx)) - 1)
qtr.start + days
## [1] "2014-07-01"
答案 2 :(得分:0)
假设每个季度的传统概念分别从1月1日,4月1日,7月1日和9月1日开始(与quarters
功能一致),请从这些日期开始,每周增加7天:
x <- c("01-3-2014","01-1-2014","05-4-2014","01-2-2014","02-3-2014")
y <- as.numeric(substr(x,6,9))
m <- as.numeric(substr(x,4,4))
d <- as.numeric(substr(x,1,2))
as.Date(paste(y,(m-1)*3+1,"01",sep="-")) + (7*(d-1))
#[1] "2014-07-01" "2014-01-01" "2014-10-29" "2014-04-01" "2014-07-08"