【问题标题】:Format date strings comprising weeks and quarters as Date objects将包含周和季度的日期字符串格式化为 Date 对象
【发布时间】:2014-10-01 22:02:05
【问题描述】:

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

我想把每个日期变成一个Date() 对象。

所以我改变了格式,使它看起来像01-3-2014。例如,我想尝试做类似as.Date("01-3-2014","%W-%Q-%Y") 之类的事情,但我所知道的季度没有格式代码。

有没有办法使用lubridatezoo 或任何其他库来做到这一点?

【问题讨论】:

  • Quarter+Week 不会唯一指定日期。它如何知道使用一周中的哪一天?你期待“WK01Q32014”变成什么? R 日期值必须能够解析为月+日期+年。
  • 这类似于“一年中的一周”问题,但更频繁……您需要确定哪一周被认为是季度的“第一”周。

标签: r zoo lubridate


【解决方案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"

【讨论】:

  • 那么您是否假设“第一”周有 W00 值?令人惊讶的是,“WK01Q12014”没有在 1 月 1 日返回,因为到 8 日你应该在第二周。
  • @MrFlick,哎呀!不,我已经忘记了 ` - 1` 好几个星期了。我编辑了我的答案。感谢您了解这一点
  • 这样更好。您仍在做很多假设(例如,季度每 13 周开始,不一定在每第三个月开始),并且任何给定年份返回的星期几总是与第一天相同年。并不是说这些是错误的假设,只是其他人可能对“第三季度的第二周”对应的日期有不同的定义。这不是一个定义明确的术语。
【解决方案2】:

周、季度和年并没有唯一地定义日期,因此我们必须添加一些假设。这里我们添加假设第一周是季度的第一天,第二周是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"

【讨论】:

    【解决方案3】:

    假设每个季度的传统概念分别从 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2014-03-01
      • 2014-01-28
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多