我正在寻找一个函数,可以获取年份+周数+星期几,并返回日期。例如:
我想输入以下3个值:
我想输入以下3个值:
2015
Monday
23
并获得所需的输出:
"2015-06-08"
在网上搜索后,似乎其他语言中都有类似的问题,但R语言中没有:
对此任何帮助都将不胜感激!
2015
Monday
23
并获得所需的输出:
"2015-06-08"
在网上搜索后,似乎其他语言中都有类似的问题,但R语言中没有:
对此任何帮助都将不胜感激!
使用 strptime
:
strptime("2015Monday23", "%Y%A%U")
# [1] "2015-06-08"
或更普遍地说
strptime(paste0(2015, "Monday", 23), "%Y%A%U")
结果取决于当前区域设置。
在我的区域设置"German_Germany.1252"
(调用Sys.getlocale("LC_TIME")
检查您的区域设置),strptime("2015Monday23", "%Y%A%U")
返回NA
。
结果取决于一年中周数的编号惯例。
有三种惯例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"
strptime
返回与as.POSIXlt
相同的类/属性。虽然我忘记了A
,所以这里做得很好。 - David Arenburg