2014-10-18 70 views
15

我有一個日期對象向量(yyyy-mm-dd),我想確定它們中的任何一個是否在週末。有沒有一個函數可以確定這個直觀?如何確定日期是否是週末(不使用lubridate)

我可以在lubridate包中使用wday(),然後決定是否返回的值是0107,但別的更簡單?

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

'來自「cron」的is.weekend'? – A5C1D2H2I1M1N2O1R2T1 2014-10-18 16:07:52

+0

爲什麼'lubridate'方法不直​​截了當? – 2014-10-18 16:13:05

+0

http://stackoverflow.com/questions/9216138/find-the-day-of-a-week-in-r – GSee 2014-10-18 21:22:14

回答

10

我把@ 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" 
15

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

簡單幹淨的方法+1 – 2014-10-18 16:09:38

+3

@TylerRinker,但區域依賴... – A5C1D2H2I1M1N2O1R2T1 2014-10-18 16:13:57

7

另一種方法可以是使用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" 
+2

幸運的是,有還有'%w'將星期天映射到'0'。所以我們都可以安居樂業。 'data.frame(a = format(x,「%a」),u = format(x,「%u」),w = format(x,「%w」))''。 – flodel 2014-10-18 16:48:58

4

wday兩個lubridatedata.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 

,然後測試其他答案的週末日期。

0

您可以使用isWeekendpackage timeDate。很難做更直接的:)。 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

相關問題