【问题标题】:How to convert date to the closest weekend (Saturday)如何将日期转换为最近的周末(星期六)
【发布时间】:2019-06-23 12:26:01
【问题描述】:

我有一个日期格式为“%d-%m-%Y”的数据框,并且有周数。日期是工作日,我希望该周的星期六在另一列中。

我最初使用 Chron 包中的函数检查日期是工作日还是周末,但这是一个布尔验证。我已将日期变量格式化为日期格式并提取每个日期的周数。

df = data.frame(date=c("2014-08-20", "2014-08-25", "2014-10-08")) 
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))

预期的结果应该是:

date        week    EOW  
2014-08-20   34   2014-08-23

2014-08-25   34   2014-08-30

2014-10-08   41   2014-10-11

【问题讨论】:

    标签: r date lubridate weekend chron


    【解决方案1】:

    另一种使用方式

    library(data.table)
    df <- data.table(date=c("2014-08-20", "2014-08-25", "2014-10-08")) 
    df$date=as.Date(df$date,format="%Y-%m-%d")
    df$week=week(ymd(df$date))
    
    ## if the locale is not English, please use the local values for days 
    days <- data.frame(DOW = c("Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", "Sunday"))
    days$day <- seq(1,7,1)
    
    df <- df[,DOW:= weekdays(date)]
    df <- merge(df, days, all.x = T, by = "DOW")
    
    df <- df[, EOW := date + (6 - day)]
    df
    
             DOW       date week day        EOW
    1:    Monday 2014-08-25   34   1 2014-08-30
    2: Wednesday 2014-08-20   34   3 2014-08-23
    3: Wednesday 2014-10-08   41   3 2014-10-11
    

    【讨论】:

    • 至于其他答案,此解决方案取决于区域设置。在那里查看我的评论。
    【解决方案2】:

    玩转data.table 连接语法:

    library(data.table)
    
    # Create a saturdays dataset
    saturdays2014 <- data.table(date = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), by = 1))
    Sys.setlocale("LC_ALL","English")
    saturdays2014 <- saturdays2014[weekdays(date) == "Saturday"]
    
    # convert df to data.table and date to a Date variable
    setDT(df)[, date := as.Date(date)]
    
    # Join
    df[saturdays2014, on = "date", roll = 6, EOW := i.date]
    df    
    #          date        EOW
    # 1: 2014-08-20 2014-08-23
    # 2: 2014-08-25 2014-08-30
    # 3: 2014-10-08 2014-10-11
    

    【讨论】:

    • 也是本地依赖,但应该足以过滤以知道一个星期六的日期,并从那里使用它们每 7 天发生一次的事实。
    【解决方案3】:

    基础 R 选项。首先创建一个所有天的列表,然后将matchweekdays 相减,然后从6 中减去它(正如我们想要的星期六),得到我们需要在原始date 列中添加的天数。

    all_days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
    
    #As @nicola mentioned this is locale dependent
    #If your locale is not English you need weekdays in your current locale
    #which you can manually write as shown above or do any one of the following
    
    #all_days <- weekdays(seq(as.Date("2019-01-14"),by="day",length.out=7))
    #OR
    #all_days <- format(seq(as.Date("2019-01-14"),by="day",length.out=7), "%A")
    
    df$EOW <- df$date + 6 - match(weekdays(df$date), all_days)
    
    df
    #        date week        EOW
    #1 2014-08-20   34 2014-08-23
    #2 2014-08-25   34 2014-08-30
    #3 2014-10-08   41 2014-10-11
    

    或者lubridate 有一个函数ceiling_dateunit = "week" 一起使用时会返回下一个“星期日”,因此我们从中减去1 天得到“星期六”。

    library(lubridate)
    df$EOW <- ceiling_date(df$date, unit = "week") - 1
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2019-10-08
      • 2021-09-27
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多