在R中为当前日期创建年/周格式

时间:2015-02-16 14:07:09

标签: r lubridate

我正在撰写这篇文章,因为我找不到其他问题已被回答的帖子。

创建" y / w"的最佳代码是什么? R?中的格式(y是2位数年份和w 2位数周数) 到目前为止,这就是我正在使用的:

require(lubridate)
paste(substr(year(Sys.Date()),3,4),sprintf("%02d", isoweek(Sys.Date())), sep="/")

但当然,这可能会在今年的最后几天或第一天失败;例如,它可以给出一个" 16/53" 2016年1月1日的结果(虽然它应该是" 16/01")。

我正在考虑基于Sys.Date高于或低于1月1日并将其与wday函数相结合的if-else构造,但我确定必须有更优雅,更简洁的解决方案。

你有什么线索吗?
谢谢,
MZ

4 个答案:

答案 0 :(得分:2)

您可能需要调整lubridate::isoweek以返回所需的字符串:

isodate <- function (x = Sys.Date()) {
  xday <- ISOdate(year(x), month(x), day(x), tz = tz(x))
  dn <- 1 + (wday(x) + 5)%%7
  nth <- xday + ddays(4 - dn)
  jan1 <- ISOdate(year(nth), 1, 1, tz = tz(x))
  return(sprintf("%s/%02d", format(nth, "%y"), 1 + (nth - jan1)%/%ddays(7)))
}
isodate(as.Date("2016-01-01"))
# [1] "15/53"
isodate(as.Date("2015-01-01"))
# [1] "15/01"
isodate(Sys.Date())
# [1] "15/08"

答案 1 :(得分:1)

如果您在2018年在这里,请尝试通过yearweek

library(tsibble)
library(tidyverse)

my_date <- "2018-01-01"

yearweek(my_date) %>% 
  str_replace(" W", "/") %>% 
  str_replace("^20", "")

#> [1] 17/52

答案 2 :(得分:1)

使用 lubridate 包函数 isoyear() 结合 isoweek(),可以获得您问题的单行答案。

library(stringr)
library(lubridate)

dates <- ymd(c("2016-01-01", "2015-12-31", "2015-01-01"))

# check dates[1] and dates[2] are in the same week
wday(dates)
#> [1] 6 5 5

str_c(
  formatC(isoweek(dates), format = "f", digits = 0, width = 2, flag = "0"), 
  "/", 
  str_sub(isoyear(dates), 3, 4))
#> [1] "53/15" "53/15" "01/15"

reprex package (v0.3.0) 于 2021 年 2 月 12 日创建

答案 3 :(得分:0)

isoweek()替换为来自lubridate的函数week()

> paste(substr(year(x),3,4),sprintf("%02d", week(x)), sep="/")
[1] "16/01"