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

Don*_*yck 19 datetime r lubridate

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

我可以wday()lubridate包中使用,然后确定返回的值是否,01或者07其他更直接的东西?

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

Ric*_*ven 20

您可以使用基本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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 12

我把@ 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"
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 10

另一种方法可以是使用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"
Run Code Online (Sandbox Code Playgroud)

  • 幸运的是,还有'%w`将星期日映射到'0'.所以我们都可以和平相处.`data.frame(a = format(x,"%a"),u = format(x,"%u"),w = format(x,"%w"))`. (3认同)

rsm*_*h54 6

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

is_weekday = function(timestamp){
  lubridate::wday(timestamp, week_start = 1) < 6
}
Run Code Online (Sandbox Code Playgroud)


hrb*_*str 5

wday在这两个lubridatedata.table(是的,data.table有几乎一切,但厨房的水槽:-)都做一个变化:

as.POSIXlt(x, tz = tz(x))$wday + 1 # lubridate
as.POSIXlt(x)$wday + 1L            # data.table
Run Code Online (Sandbox Code Playgroud)

理论上,你可以做到:

as.POSIXlt("2014-10-18")$wday + 1
## [1] 7
Run Code Online (Sandbox Code Playgroud)

然后像其他答案一样测试周末的日子.