在R语言中如何从周数和年份获取该周的起始日期?

6
我正在寻找一个函数,可以获取年份+周数+星期几,并返回日期。例如:
我想输入以下3个值:
 2015
 Monday
 23

并获得所需的输出:

"2015-06-08"

在网上搜索后,似乎其他语言中都有类似的问题,但R语言中没有:

如何从周数和年份获取日期

对此任何帮助都将不胜感激!

2个回答

11

使用 strptime

strptime("2015Monday23", "%Y%A%U")
# [1] "2015-06-08"

或更普遍地说

strptime(paste0(2015, "Monday", 23), "%Y%A%U")

2
strptime 返回与 as.POSIXlt 相同的类/属性。虽然我忘记了 A,所以这里做得很好。 - David Arenburg
注意 ISO 日期中 isoyear != year 的情况(可能发生在一年的第一周/最后一周,请参见 https://en.wikipedia.org/wiki/ISO_week_date#First_week)。 - koldLight

1
这里有两个注意事项:
  1. 结果取决于当前区域设置。
    在我的区域设置"German_Germany.1252"(调用Sys.getlocale("LC_TIME")检查您的区域设置),strptime("2015Monday23", "%Y%A%U")返回NA

  2. 结果取决于一年中周数的编号惯例。
    有三种惯例R知道:美国、英国和ISO 8601。请参见this answer进行详细讨论。因此,必须指定要用于转换的惯例。

非英语区域设置

如果您处于非英语区域设置,则可以通过暂时更改当前区域设置来处理英语工作日名称(或月份名称,同样):

Sys.setlocale("LC_TIME", "US")
#> [1] "English_United States.1252"
strptime("2015Monday23", "%Y%A%U")
#> [1] "2015-06-08 CEST"
Sys.setlocale("LC_TIME")
#> [1] "German_Germany.1252"
包提供了一种更方便的方法:
lubridate::parse_date_time("2015Monday23", "YAU", locale = "US")
#> [1] "2015-06-08 UTC"

不同规范下的一年中的周数

由于工作日是按名称给出的,美国和英国的规范返回相同的结果:

lubridate::parse_date_time("2015Monday23", "YAU", locale = "US")
#> [1] "2015-06-08 UTC"
lubridate::parse_date_time("2015Monday23", "YAW", locale = "UK")
#> [1] "2015-06-08 UTC"

很遗憾,ISO 8601约定的格式说明符不被接受输入。因此,我们反向处理并将结果日期格式化为不同约定中的年周,这显示了ISO 8601的不同结果。

format(as.Date("2015-06-08 UTC"), "%Y-%W-%u") # UK convention
#> [1] "2015-23-1"
format(as.Date("2015-06-08 UTC"), "%Y-%U-%w") # US convention
#> [1] "2015-23-1"
format(as.Date("2015-06-08 UTC"), "%G-%V-%u") # ISO 8601
#> [1] "2015-24-1"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接