我正在寻找能够获得年份+周数+周日的功能,并返回日期,例如:
我想输入以下3个
2015
Monday
23
获得所需的输出:
"2015-06-08"
在网上搜索后,似乎在其他语言中存在相同的问题,但在R中没有:
How to Get date from week number and year
任何帮助都会很棒!
答案 0 :(得分:10)
使用strptime
:
strptime("2015Monday23", "%Y%A%U")
# [1] "2015-06-08"
或者更一般地说
strptime(paste0(2015, "Monday", 23), "%Y%A%U")
答案 1 :(得分:0)
这里有两点需要注意:
结果取决于当前的区域设置
在我的区域设置"German_Germany.1252"
(致电Sys.getlocale("LC_TIME")
以检查您的区域设置)中,strptime("2015Monday23", "%Y%A%U")
返回NA
。
结果取决于一年中数周的编号惯例
R
有3个约定:US,UK和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"