从周的年份和年份获得周开始日期

时间:2015-06-11 09:18:07

标签: r date

我正在寻找能够获得年份+周数+周日的功能,并返回日期,例如:

我想输入以下3个

 2015
 Monday
 23

获得所需的输出:

"2015-06-08"

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

How to Get date from week number and year

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:10)

使用strptime

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

或者更一般地说

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

答案 1 :(得分:0)

这里有两点需要注意:

  1. 结果取决于当前的区域设置 在我的区域设置"German_Germany.1252"(致电Sys.getlocale("LC_TIME")以检查您的区域设置)中,strptime("2015Monday23", "%Y%A%U")返回NA

  2. 结果取决于一年中数周的编号惯例 R有3个约定:US,UK和ISO 8601.有关详细讨论,请参阅this answer。因此,必须指定用于转换的约定。

  3. 非英语语言环境

    如果您使用的是非英语语言环境,则可以通过临时更改当前语言环境来处理英语工作日名称(或同样的月份名称):

    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"