【发布时间】:2015-06-11 09:18:06
【问题描述】:
我正在寻找一个函数,它将获取年份 + 周数 + 星期,并返回一个日期,例如:
我想输入以下3个
2015
Monday
23
并获得所需的输出:
"2015-06-08"
在网上搜索后,其他语言中似乎有相同的问题,但 R 中没有:
How to Get date from week number and year
在这方面的任何帮助都会很棒!
【问题讨论】:
我正在寻找一个函数,它将获取年份 + 周数 + 星期,并返回一个日期,例如:
我想输入以下3个
2015
Monday
23
并获得所需的输出:
"2015-06-08"
在网上搜索后,其他语言中似乎有相同的问题,但 R 中没有:
How to Get date from week number and year
在这方面的任何帮助都会很棒!
【问题讨论】:
使用strptime:
strptime("2015Monday23", "%Y%A%U")
# [1] "2015-06-08"
或者更一般的
strptime(paste0(2015, "Monday", 23), "%Y%A%U")
【讨论】:
strptime 返回与as.POSIXlt 相同的类/属性。虽然我忘记了A,但那里很好。
这里有两个警告:
结果取决于当前的语言环境。
在我的语言环境"German_Germany.1252"(调用Sys.getlocale("LC_TIME") 以检查您的语言环境)中,strptime("2015Monday23", "%Y%A%U") 返回NA。
结果取决于对一年中的周数进行编号的约定。R 知道 3 种约定:美国、英国和 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 包提供了一种更方便的方法:
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"
【讨论】: