web-dev-qa-db-ja.com

日付が週末であるかどうかを判別する方法(ルブリデートを使用しない)

日付オブジェクトのベクトル(_yyyy-mm-dd_)があり、それらのいずれかが週末にあるかどうかを確認したいと思います。これをすぐに決定できる関数はありますか?

lubridateパッケージでwday()を使用して、戻り値が_01_または_07_であるかどうかを確認できますが、他にもっと簡単なことはありますか?

_x <- seq(Sys.Date()-10, Sys.Date(), by = 1)
x[lubridate::wday(x) %in% c(1, 7)]
_
20
DonDyck

ここでは、コメントではなく@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"
12
Tyler Rinker

基本の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
_
20
Rich Scriven

別の方法としては、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"
10

wdaydata.tableの両方のlubridate(はい、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

他の回答と同様に、週末の日をテストします。

5
hrbrmstr

package timeDate から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でも機能します。

0
Florent

このトピックについてよく調べた後、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)

誰かのお役に立てば幸いです

0
Ivan

Lubridateを使用して他のパッケージを回避するには、以下を使用できます。

is_weekday = function(timestamp){
  lubridate::wday(timestamp, week_start = 1) < 6
}
0
rsmith54