2014-10-18 20 views
15

Tôi có một véc tơ của các đối tượng ngày (yyyy-mm-dd) và tôi muốn xác định xem có ngày nào cuối tuần không. Có chức năng nào có thể xác định điều này ngay lập tức không?Làm thế nào để xác định xem ngày có phải là ngày cuối tuần hay không (không sử dụng lubridate)

tôi có thể sử dụng wday() trong lubridate gói và sau đó xác định nếu giá trị trả về là 01 hoặc 07, nhưng bất cứ điều gì khác đơn giản hơn?

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

'is.weekend' từ" cron "? – A5C1D2H2I1M1N2O1R2T1

+0

Tại sao phương pháp 'lubridate' không thẳng về phía trước? –

+0

http://stackoverflow.com/questions/9216138/find-the-day-of-a-week-in-r – GSee

Trả lời

10

tôi đặt @ đề nghị AnandaMahto ở đây chứ không phải là một lời nhận xét:

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

Bạn có thể sử dụng hàm R cơ sở 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" 

As far as lubridate đi, wday() có một cuộc tranh luận label. Khi được đặt thành TRUE, tên ngày (viết tắt) được trả về thay vì số. Sử dụng đối số abbr để thay đổi thành tên đầy đủ.

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

Cách tiếp cận đơn giản, sạch sẽ +1 –

+3

@TylerRinker, nhưng phụ thuộc vào miền địa phương .... – A5C1D2H2I1M1N2O1R2T1

7

cách tiếp cận khác có thể được sử dụng format%u, mang đến cho một số cho ngày trong tuần, bắt đầu với "1 "đại diện" Thứ Hai ".

Với điều đó, bạn có thể làm:

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

May mắn thay, có cũng '% w' ánh xạ chủ nhật thành' 0'. Vì vậy, tất cả chúng ta đều có thể sống trong hòa bình. 'data.frame (a = định dạng (x,"% a "), u = định dạng (x,"% u "), w = định dạng (x,"% w "))'. – flodel

4

Các wday trong cả lubridatedata.table (vâng, data.table có khá nhiều tất cả mọi thứ nhưng bồn rửa nhà bếp :-) cả làm một sự thay đổi trên:

as.POSIXlt(x, tz = tz(x))$wday + 1 # lubridate 
as.POSIXlt(x)$wday + 1L   # data.table 

Vì vậy, bạn có thể, theo lý thuyết, chỉ cần làm:

as.POSIXlt("2014-10-18")$wday + 1 
## [1] 7 

và sau đó kiểm tra cho những ngày cuối tuần như câu trả lời khác (s) làm.

0

Bạn có thể sử dụng isWeekend từ package timeDate. Khó làm đơn giản hơn :). wday chỉ định ngày nào sẽ được xem là ngày trong tuần. Theo mặc định từ thứ Hai đến thứ Sáu.

> today <- isWeekend(Sys.Date(), wday = 1:5) 
if (as.logical(today)){ 
    print("YES") 
} else print("NO") 

Từ các tài liệu:

## 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)] 

Nó cũng làm việc với isWeekday.

Các vấn đề liên quan