我有一个日期对象的向量(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函数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
我把@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"
另一种方法是使用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"))
。 - flodel使用lubridate避免使用其他包,您可以使用:
is_weekday = function(timestamp){
lubridate::wday(timestamp, week_start = 1) < 6
}
lubridate
和 data.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在研究了很多关于这个主题的内容后,我发现使用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)
希望对某些人有所帮助
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
。
lubridate
方法为什么不容易理解? - Tyler Rinker