【问题标题】:How to get all days inside a week?如何获得一周内的所有时间?
【发布时间】:2020-11-30 12:30:41
【问题描述】:

我有一段时期,我想从星期一到星期日分成几个星期。

使用lubridate可以查询日期的周数:

library(lubridate)
td = today()
week(td) #48

我怎样才能找到属于 2020 年第 48 周的所有日子?

【问题讨论】:

    标签: r lubridate week-number


    【解决方案1】:

    您可以使用seqas.Date,其中%Y 是年份,%W 是一年中的一周,%a 是工作日的缩写。

    seq(as.Date("2020-48-Mo", "%Y-%W-%a"), by=1, length.out=7)
    #as.Date("2020-48-Mo", "%Y-%W-%a") + 0:6 #Alternative
    #as.Date("2020-48-1", "%Y-%W-%u") + 0:6 #Alternative
    #[1] "2020-11-30" "2020-12-01" "2020-12-02" "2020-12-03" "2020-12-04"
    #[6] "2020-12-05" "2020-12-06"
    

    如果星期日是第一天,请使用 %U,如果星期一是 %W,则使用 0 开始的几周。使用%V,星期一作为第一天,星期以1 开始。

    如果你有一个日期并且想要这周的所有日子:

    x <- as.Date("2020-11-25")
    x - as.integer(format(x, "%u")) + 1:7
    #[1] "2020-11-23" "2020-11-24" "2020-11-25" "2020-11-26" "2020-11-27"
    #[6] "2020-11-28" "2020-11-29"
    

    【讨论】:

    • 不错!我从来没有用过%U
    • 几乎,但这还不够:OP想要所有日期,例如第 48 周。seq(as.Date("2020-48", "%Y-%U"), by=1, length.out=7) %&gt;% week() 给出:[1] 48 48 49 49 49 49 49
    • 我认为 R 和 lubridate 的计算方式不同,R 只计算从年初开始的整周,而 lubridate 使用实际的日历年。例如,本周是 R 中从星期一开始的第 48 个完整周,即使它是第 49 个日历周,因为该周始于 2019 年。
    • 我得到了format(seq(as.Date("2020-48-Mo", "%Y-%W-%a"), by=1, length.out=7), "%W") "48" "48" "48" "48" "48" "48" "48"。这也取决于您是从0 还是从1 开始计算周数。
    • 太好了,这很聪明!请注意,lubridate::parse_date() 不支持那些非常方便的格式。
    【解决方案2】:

    根据 GKi 的回答,我可以编写一个非常方便的函数:

    library(lubridate, warn.conflicts=F)
    library(glue, warn.conflicts=F)
    get_week = function(x){
      week_monday = glue("{year(x)}-{isoweek(x)-1}-1")
      week_monday = as.Date(week_monday, "%Y-%W-%u")
      seq(week_monday, by=1, length.out=7)
    }
    get_week(ymd("2020-11-25")) #a wednesday
    #> [1] "2020-11-23" "2020-11-24" "2020-11-25" "2020-11-26" "2020-11-27"
    #> [6] "2020-11-28" "2020-11-29"
    get_week(ymd("2020-11-30")) #a monday
    #> [1] "2020-11-30" "2020-12-01" "2020-12-02" "2020-12-03" "2020-12-04"
    #> [6] "2020-12-05" "2020-12-06"
    

    reprex package (v0.3.0) 于 2020 年 11 月 30 日创建

    【讨论】:

    • 您可以使用%u1 而不是获取星期一字符串
    • @GKi 非常正确,我更正了我的功能,再次感谢!
    • 替代方案可以是:get_week &lt;- function(x) {seq(x - as.integer(format(x, "%u")) + 1, by=1, length.out=7)}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多