如何确定日期是否是周末(不使用lubridate)

时间:2014-10-18 15:59:23

标签: r datetime lubridate

我有一个日期对象的矢量(yyyy-mm-dd),我想确定它们是否在周末。是否有能够直接确定这一功能的功能?

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

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

7 个答案:

答案 0 :(得分:18)

您可以使用基本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 :(得分:11)

我在这里提出@ 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"

答案 2 :(得分:8)

另一种方法可能是使用format%u,它会为一周中的某一天提供一个数字,从&#34; 1&#34;代表&#34;星期一&#34;。

有了这个,你可以这样做:

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 :(得分:5)

wdaylubridate中的data.table(是的,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

然后像其他答案那样测试周末的日子。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

在仔细研究了这个主题之后,我发现使用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)

我希望它能对某人有所帮助