如何确定日期是周末还是工作日(不使用lubridate)

28

我有一个日期对象的向量(yyyy-mm-dd),想要确定它们中是否有任何一个是周末。有没有一种直接确定这个的函数?

我可以使用lubridate包中的wday()函数,然后确定返回值是否为0107,但还有更简单的方法吗?

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

5
"cron" 中的 "is.weekend" 是什么意思?(翻译:What does "is.weekend" mean in "cron"?) - A5C1D2H2I1M1N2O1R2T1
1
lubridate 方法为什么不容易理解? - Tyler Rinker
https://dev59.com/emox5IYBdhLWcg3wbDsk - GSee
7个回答

32

您可以使用基本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

15

我把@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,你能否提供一个可重现的例子吗?你添加了一个无法测试的贬低性评论,可能会让其他人远离正确的答案。相反,如果你是正确的,我会删除答案或相应地更新它。我怀疑你的数据类型有些问题,导致了这个问题,但无论如何,我想找到问题所在(这个答案或你的数据)。我建议你删除这个评论,并打开一个新的问题,附上能够演示问题的数据(一个可重现的例子),然后链接回这个问题/答案。 - Tyler Rinker

11

另一种方法是使用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"

3
幸运的是,%w 也可以将星期日映射为 0。因此我们都能和平共处。data.frame(a = format(x, "%a"), u = format(x, "%u"), w = format(x, "%w")) - flodel

6

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

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

5
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时。 - agent18

3

在研究了很多关于这个主题的内容后,我发现使用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)

希望对某些人有所帮助


这个回答非常被低估。非常感谢。 - Ian

2
你可以使用timeDate包中的isWeekend函数。很难再更直接了 :). 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接