将包含周和季度的日期字符串格式化为Date对象

时间:2014-10-01 22:02:06

标签: r zoo lubridate

我在R数据帧列中有日期,格式为字符串WK01Q32014

我想将每个日期转换为Date()对象。

所以我改变了格式,使其看起来像01-3-2014。我想尝试做一些像as.Date("01-3-2014","%W-%Q-%Y")这样的事情,但是我所知道的季度没有格式代码。

有没有办法使用lubridatezoo或任何其他库来执行此操作?

3 个答案:

答案 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"