格式化日期为年/季

fed*_*r80 16 r date

我有以下数据帧:

Data <- data.frame(
  date = c("2001-01-01", "2001-02-01", "2001-03-01", "2001-04-01", "2001-05-01", "2001-06-01"),
  qtr = c("NA", "NA","NA","NA","NA","NA")
)
Run Code Online (Sandbox Code Playgroud)

我想用Year/Quater填写Data $ qtr - fe 01/01(我需要这种格式!).

我写了一个函数:

fun <- function(x) { 
  if(x == "2001-01-01" | x == "2001-02-01" | x == "2001-03-01") y <- "01/01"
  if(x == "2001-04-01" | x == "2001-05-01" | x == "2001-06-01") y <- "01/02"
  return(y)
}
n$qtr <- sapply(n$date, fun)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我总是收到错误消息:

Error in FUN(X[[1L]], ...) : Object 'y' not found
Run Code Online (Sandbox Code Playgroud)

为什么?

ton*_*nov 29

你需要说明Vectorize你的功能:

fun_v <- Vectorize(fun, "x")
fun_v(Data$date)
#[1] "01/01" "01/01" "01/01" "01/02" "01/02" "01/02"
Run Code Online (Sandbox Code Playgroud)

但是,当涉及或多或少的标准任务(例如日期时间操作)时,总有一个解决方案已经可用:

library(zoo)
yq <- as.yearqtr(Data$date, format = "%Y-%m-%d")
yq
#[1] "2001 Q1" "2001 Q1" "2001 Q1" "2001 Q2" "2001 Q2" "2001 Q2"
Run Code Online (Sandbox Code Playgroud)

要转换为您的特定格式,请使用

format(yq, format = "%y/0%q")
#[1] "01/01" "01/01" "01/01" "01/02" "01/02" "01/02"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。使用 "format(z, format="%y/0%q") 会很完美。但结果我得到了 "01/0q" 等等 (2认同)

Jef*_*ker 12

我一直很喜欢lubridate处理日期的包。超级滑。该quarter函数找到季度(当然),然后将其与年份配对。

library(lubridate)
Data <- Data %>%
  mutate(qtr = paste0(substring(year(date),3,4),"/0",quarter(date))) 
Run Code Online (Sandbox Code Playgroud)

如果你不熟悉的%>%,从magrittr第一行基本上说“所谓的使用数据帧Data”,第二行显示“发生变异(或增加)一个名为列qtr

编辑 2021-Q2

如果“YY/QQ”格式不重要,那么快速安全的获取年份和季度的方法是:

library(lubridate)
Data %>%
  mutate(qtr = quarter(date, with_year = T))
Run Code Online (Sandbox Code Playgroud)

  • 或者与年份参数一起使用:`quarter(x, with_year = TRUE)` (5认同)

Rol*_*and 10

使用基本功能:

Data$date <- as.Date(Data$date)
Data$qtr <- paste(format(Data$date, "%y"), 
                  sprintf("%02i", (as.POSIXlt(Data$date)$mon) %/% 3L + 1L), 
                  sep="/")

#         date   qtr
# 1 2001-01-01 01/01
# 2 2001-02-01 01/01
# 3 2001-03-01 01/01
# 4 2001-04-01 01/02
# 5 2001-05-01 01/02
# 6 2001-06-01 01/02
Run Code Online (Sandbox Code Playgroud)


Beg*_*ath 7

我在 R 中使用quarters()和制作了类似的格式sub()

Data$qtr <- paste(format(Data$date, "%y/"), 0, 
                  sub( "Q", "", quarters(Data$date) ), sep = "")
Run Code Online (Sandbox Code Playgroud)


Sve*_*enB 7

另一种选择是:

Data$qtr <- lubridate::quarter(Data$date, with_year = T)
Run Code Online (Sandbox Code Playgroud)