【问题标题】:How to determine if date is a weekend or not (not using lubridate)如何确定日期是否是周末(不使用 lubridate)
【发布时间】:2014-12-14 00:31:18
【问题描述】:

我有一个日期对象向量 (yyyy-mm-dd),我想确定其中任何一个是否在周末。有没有可以直接确定的功能?

我可以在 lubridate 包中使用wday(),然后确定返回值是01 还是07,还有其他更直接的方法吗?

x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[lubridate::wday(x) %in% c(1, 7)]

【问题讨论】:

标签: r datetime lubridate


【解决方案1】:

您可以使用基本 R 函数weekdays()

x <- seq(Sys.Date() - 10, Sys.Date(), by = 1)
weekdays(x, abbr = TRUE)
# [1] "Wed" "Thu" "Fri" "Sat" "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat"
x[grepl("S(at|un)", weekdays(x))]
# [1] "2014-10-11" "2014-10-12" "2014-10-18"

lubridate 而言,wday() 有一个 label 参数。当设置为TRUE 时,将返回(缩写的)日期名称而不是数字。使用 abbr 参数更改为全名。

library(lubridate)
wday(x, label = TRUE)
# [1] Wed   Thurs Fri   Sat   Sun   Mon   Tues  Wed   Thurs Fri   Sat  
# Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat

【讨论】:

  • 简单干净的方法+1
【解决方案2】:

我把@AnandaMahto 的建议放在这里而不是评论:

library(chron)
x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[is.weekend(x)]

## [1] "2014-10-11" "2014-10-12" "2014-10-18"

【讨论】:

  • @ConstanzaGarcia 你能让这个可重现吗?您添加了无法测试的贬义评论,可能会使其他人远离正确答案。相反,您可能是正确的,如果是这样,我会删除答案或相应地更新它。我怀疑您的数据类型中存在导致问题的问题,但无论哪种方式都希望解决问题(此答案或您的数据)。我是否可以建议您删除此评论并使用您的数据打开一个新问题来证明问题(一个可重复的示例),然后链接回此问题/答案。
【解决方案3】:

另一种方法是使用format%u,它们给出了星期几的数字,以“1”开头代表“星期一”。

有了它,你可以这样做:

x <- seq(as.Date("2014-10-18")-10, Sys.Date(), by = 1)
format(x, "%u") %in% c(6, 7)
#  [1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
x[format(x, "%u") %in% c(6, 7)]
# [1] "2014-10-11" "2014-10-12" "2014-10-18"

【讨论】:

  • 幸运的是,还有 %w 将星期日映射到 0。所以我们都可以和平相处。 data.frame(a = format(x, "%a"), u = format(x, "%u"), w = format(x, "%w")).
【解决方案4】:

lubridatedata.table 中的 wday(是的,data.table 几乎什么都有,除了厨房水槽 :-) 两者都有变化:

as.POSIXlt(x, tz = tz(x))$wday + 1 # lubridate
as.POSIXlt(x)$wday + 1L            # data.table

所以理论上你可以这样做:

as.POSIXlt("2014-10-18")$wday + 1
## [1] 7

然后像其他答案一样测试周末。

【讨论】:

  • 注意: c(1,2,3,4,5) 是工作日。 c(6,0) 是周末你做as.POSIXlt("2014-10-18")$wday
【解决方案5】:

使用lubridate避免其他包,可以使用:

is_weekday = function(timestamp){
  lubridate::wday(timestamp, week_start = 1) < 6
}

【讨论】:

    【解决方案6】:

    您可以使用来自package timeDateisWeekend。很难做到更直接:)。 wday 指定应将哪些天视为工作日。默认为周一至周五。

    > today <- isWeekend(Sys.Date(), wday = 1:5)
    if (as.logical(today)){
      print("YES")
    } else print("NO")
    

    来自文档:

    ## Dates in April, currentYear:
       currentYear = getRmetricsOptions("currentYear")
       tS = timeSequence(
          from = paste(currentYear, "-03-01", sep = ""),
          to = paste(currentYear, "-04-30", sep = ""))
       tS
    
    ## Subset of Weekends:
       isWeekend(tS)
       tS[isWeekend(tS)]
    

    它也适用于isWeekday

    【讨论】:

      【解决方案7】:

      在看了很多关于这个话题之后,我发现这个解决方案特别简单,使用包 RQuantLib

      install.packages("RQuantLib")
      library(RQuantLib)
      isBusinessDay(calendar="WeekendsOnly", dates=yourdatesofinterest)
      

      您可以使用不同的日历修改此代码,以便为周末添加不同国家/地区的不同假期集(以下仅为示例,但还有更多示例)。

      isBusinessDay(calendar="UnitedStates", dates=yourdatesofinterest)
      isBusinessDay(calendar="UnitedStates/Settlement", dates=yourdatesofinterest)
      isBusinessDay(calendar="UnitedStates/NYSE", dates=yourdatesofinterest)
      isBusinessDay(calendar="Sweden", dates=yourdatesofinterest)
      isBusinessDay(calendar="Mexico", dates=yourdatesofinterest)
      

      希望对大家有所帮助

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2013-06-11
        相关资源
        最近更新 更多