【问题标题】:Get week starting date from weeknum and year in R从 R 中的 weeknum 和 year 获取周开始日期
【发布时间】:2015-06-11 09:18:06
【问题描述】:

我正在寻找一个函数,它将获取年份 + 周数 + 星期,并返回一个日期,例如:

我想输入以下3个

 2015
 Monday
 23

并获得所需的输出:

"2015-06-08"

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

How to Get date from week number and year

在这方面的任何帮助都会很棒!

【问题讨论】:

    标签: r date


    【解决方案1】:

    使用strptime

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

    或者更一般的

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

    【讨论】:

    • strptime 返回与as.POSIXlt 相同的类/属性。虽然我忘记了A,但那里很好。
    • 请注意 isoyear != year 的 ISO 日期(可能发生在一年的第一周/最后一周,请参阅 en.wikipedia.org/wiki/ISO_week_date#First_week
    【解决方案2】:

    这里有两个警告:

    1. 结果取决于当前的语言环境。
      在我的语言环境"German_Germany.1252"(调用Sys.getlocale("LC_TIME") 以检查您的语言环境)中,strptime("2015Monday23", "%Y%A%U") 返回NA

    2. 结果取决于对一年中的周数进行编号的约定。
      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"
    

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 2010-11-19
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多