2014-10-18 18 views
15

Bir tarih nesnesi (yyyy-mm-dd) var ve bunların hafta sonu olup olmadığını belirlemek istiyorum. Bu gerçeği belirleyebilecek bir işlev var mı?Tarihin bir hafta sonu olup olmadığı nasıl belirlenir (lubridate kullanılmıyor)

Ben lubridate pakette wday() kullanmak ve sonra döndürülen değer 01 veya 07 ama başka bir şey daha basit olup olmadığını belirleyebilir?

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

"cron" dan "is.weekend"? – A5C1D2H2I1M1N2O1R2T1

+0

Neden "lubridat" yaklaşımı düz değil mi? –

+0

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

cevap

10

ben bir yorum daha burada yerine AnandaMahto önerisi @ koyun:

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

weekdays() temel R işlevini kullanabilirsiniz.

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" 

Bildiğim kadarıyla gider lubridate olarak, wday() bir label argüman vardır. TRUE olarak ayarlandığında, (kısaltılmış) gün adları sayı yerine döndürülür. Tam adlara geçmek için abbr bağımsız değişkenini kullanın.

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

Basit temiz yaklaşma +1 –

+3

@TylerRinker, ancak yerel ayarlara bağlı .... – A5C1D2H2I1M1N2O1R2T1

7

1" ile başlayan, haftanın günü için bir sayı verir format ve %u kullanımı başka bir yaklaşım olabilir "Pazartesi" temsil ". Bunun üzerine

yapabileceğiniz yer:

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

Neyse ki, Ayrıca Pazar günü '0' ile eşleşiyor. Yani hepimiz barış içinde yaşayabiliriz. data.frame (a = biçim (x, "% a"), u = biçim (x, "% u"), w = biçim (x, "% w")) '. – flodel

4

wday hem lubridate ve data.table (her ikisi üzerinde bir çeşitleme yapmak :-) evet data.table evye ama hemen hemen her şeye sahiptir:

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

Yani, teorik olarak, sadece yapabileceği:

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

ve sonra diğer cevaplar gibi hafta sonu günlerini test edin.

0

package timeDate'dan isWeekend'u kullanabilirsiniz. Daha basit yapmak zor :). wday, hangi günlerin hafta içi gün olarak değerlendirileceğini belirtin. Varsayılan olarak pazartesiden cumaya kadar. belgelerine

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

: O isWeekday ile de çalışıyor

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

.

İlgili konular