代码之家  ›  专栏  ›  技术社区  ›  Joe

根据对工作日和本周早些时候的日期的了解,找到一个日期

r
  •  2
  • Joe  · 技术社区  · 2 月前

    我的目标是根据我已经掌握的信息找到本周晚些时候的日期,即本周早些时候的另一个日期。在这个例子中,我有一个日期2025-02-16,我可以用weekdays()计算出它是星期一。我现在想找到一周中所有其他日子的日期,从周一到周日,最好在数据框中返回这些日子和日期以供以后使用(这部分不是必需的)。

    theDate = "2025-02-17"
    theDay = "Monday"
    

    我最初的想法是像这样在while循环中做这件事,尽管这很有效,但我觉得有更好的方法来做我需要的事情,因为我必须重复几次。

    while(weekdays(as.Date(theDate))!="Sunday"){
      myDate = theDate+1
    }
    

    我的最终目标是:;

    datesdf
    Monday     Tuesday    Wednesday  Thursday   Friday     Saturday   Sunday
    2025-02-16 2025-02-17 2025-02-18 2025-02-19 2025-02-20 2025-02-21 2025-02-22
    
    3 回复  |  直到 2 月前
        1
  •  2
  •   Gregor Thomas    2 月前

    lubridate 的日期下限和上限功能将对此有所帮助:

    library(lubridate)
    full_week = function(day) {
      seq.Date(
        from = floor_date(day, unit = "week"),
        to = ceiling_date(day, unit = "week", change_on_boundary = FALSE),
        by = "day"
      )
    }
    
    theDate = "2025-02-17"
    full_week(ymd(theDate))
    # [1] "2025-02-16" "2025-02-17" "2025-02-18" "2025-02-19" "2025-02-20" "2025-02-21" "2025-02-22"
    

    这应该足以让你开始——如果你想把得到的向量日期放在数据帧中,并用日期名称命名列,我就把它留给你了。

        2
  •  2
  •   G. Grothendieck    2 月前

    1) 切。日期 转换 theDate 到日期类和使用 cut 获取星期一之前的日期,如果已经是星期一,则获取当前日期。加0:6得到一周中的所有日期。使用以下命令设置名称 weekdays 然后只保留大于或等于以下值的日期 日期 。未使用任何包。

    theDate <- "2025-02-17"
    
    dates <- as.Date(cut(as.Date(theDate), "week")) + 0:6
    dates <- setNames(dates, weekdays(dates))
    next_dates <- dates[dates >= theDate]
    next_dates
    
    ##       Monday      Tuesday    Wednesday     Thursday       Friday     Saturday       Sunday 
    ## "2025-02-17" "2025-02-18" "2025-02-19" "2025-02-20" "2025-02-21" "2025-02-22" "2025-02-23" 
    

    2) 下一个太阳 我们可以创建一个函数 nextsun 计算下一个星期日或今天(如果是星期日)的日期,然后使用 seq 这也仅使用基数R。输出如上所述。

    nextsun <- function(x) 7 * ceiling(as.numeric(x - 0 + 4)/7) + as.Date(0-4)
    next_dates <- seq(as.Date(theDate), nextsun(as.Date(theDate)), "day")
    setNames(next_dates, weekdays(next_dates))
    
        3
  •  0
  •   jay.sf    2 月前

    你可以添加一个 seq 对日期和 subset 这个 weekdays 通过1str完成仓位。

    > week_fun <- \(theDate, start_week='Monday') {
    +   data.frame(
    +     date=as.Date(theDate) + seq_len(13) - 7
    +   ) |>
    +     transform(weekday=weekdays(date)) |> 
    +     subset(cumsum(weekday == start_week) == 1)
    +   
    + }
    > 
    > week_fun("2025-02-17")
             date   weekday
    7  2025-02-17    Monday
    8  2025-02-18   Tuesday
    9  2025-02-19 Wednesday
    10 2025-02-20  Thursday
    11 2025-02-21    Friday
    12 2025-02-22  Saturday
    13 2025-02-23    Sunday
    > week_fun("2025-02-19")
             date   weekday
    5  2025-02-17    Monday
    6  2025-02-18   Tuesday
    7  2025-02-19 Wednesday
    8  2025-02-20  Thursday
    9  2025-02-21    Friday
    10 2025-02-22  Saturday
    11 2025-02-23    Sunday
    > week_fun("2025-02-19", 'Sunday')
             date   weekday
    4  2025-02-16    Sunday
    5  2025-02-17    Monday
    6  2025-02-18   Tuesday
    7  2025-02-19 Wednesday
    8  2025-02-20  Thursday
    9  2025-02-21    Friday
    10 2025-02-22  Saturday