Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为R中的当前日期创建年/周格式_R_Lubridate - Fatal编程技术网

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

为R中的当前日期创建年/周格式,r,lubridate,R,Lubridate,我写这篇文章是因为我找不到其他已经回答了这个问题的线索 在R中创建“y/w”格式(y为2位数年份,w为2位数周数)的最佳代码是什么? 到目前为止,我使用的是: require(lubridate) paste(substr(year(Sys.Date()),3,4),sprintf("%02d", isoweek(Sys.Date())), sep="/") 但当然,这可能会在一年的最后几天或最初几天失败;例如,它可以给出2016年1月1日的“16/53”结果(而应该是“16/01”) 我正在

我写这篇文章是因为我找不到其他已经回答了这个问题的线索

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

require(lubridate)
paste(substr(year(Sys.Date()),3,4),sprintf("%02d", isoweek(Sys.Date())), sep="/")
但当然,这可能会在一年的最后几天或最初几天失败;例如,它可以给出2016年1月1日的“16/53”结果(而应该是“16/01”)

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

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

isoweek()
替换为
week()
,这是lubridate的一个函数

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

您可能需要调整
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"

isodate如果您在2018年来到这里,请从TSIBLE开始尝试

library(tsibble)
library(tidyverse)

my_date <- "2018-01-01"

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

#> [1] 17/52
库(tsible)
图书馆(tidyverse)
我的约会%
str_替换(“W”和“/”)%>%
str_替换(“^20”和“)
#> [1] 17/52

使用lubridate软件包功能
isoyear()
结合
isoweek()
,可以获得问题的一行答案

库(stringr)
图书馆(lubridate)
日期[1]6 5 5
斯特鲁克(
formatC(isoweek(日期),format=“f”,数字=0,宽度=2,标志=0”),
"/", 
str_sub(等年(日期),3,4))
#> [1] "53/15" "53/15" "01/15"

由(v0.3.0)于2021-02-12创建的
格式(Sys.Date(),%Y-%U)如何?
?几乎可爱。将其更改为
格式(Sys.Date(),“%y/%U”
,但它显示今天仍然是w7,而应该是w8…这就是为什么我在润滑包中使用
isoweek
而不是
week
的原因。但是,
isoweek(as.Date(“2016-01-01”))
53
,而不是
1
。这就是你想要的吗?因为在这种情况下,我只需要修改
isoweek
函数来返回年份。我想要
15/53
,因为这是2015年的第53周。如果你尝试
isoweek(as.Date(2015-01-01))
您可以看到,在这种情况下,这是第1周,因此我的工作可能会很好(就像它在2015年12月31日之前工作正常一样)。谢谢Rahul,但我确实需要
isoweek
。正如我在上面所评论的,
week
会给我一个“7”对于今天的日期,但本周一是第八个ISO周的第一天……哇,lukeA,这超出了我的一点编码技能,我将花几分钟来进一步了解您的解决方案;尽管如此,这或多或少是我计划的备份解决方案(在1月1日的工作日工作),但到目前为止,我真的不明白为什么会出现这样的问题“普通”(?)有用的函数还没有在某些包中解决,或者还没有被询问。我是唯一对年和周的ISO版本感兴趣的人吗?R的好处是:输入一个函数名称-在本例中是
isoweek
-然后打印它的源代码。然后我只是稍微修改了它,以便它返回您想要的结果。code本身超过了我的“编码技能”,可能比你的还多……;-)哈哈,是的。我没想到要看看这个函数!!!:-)非常感谢,卢克!虽然这个链接可能会提供一些有限的、即时的帮助,一个答案,这样你的其他用户就会知道它是什么以及它为什么在那里。总是引用一个重要链接中最相关的部分,使它对其他类似的读者更有用问题。此外,其他用户倾向于对答案做出否定的回答,而他们的答案是,他们。或者使用
格式.yearweek
,如
格式(tsible::yearweek(“20180101”),%V/%y”)