2016-04-30 13 views
0

私は、30分ごとにサンプリングされた時系列を含むデータフレームを持っています(2016年)。毎週水曜日10:30:30を含むサブセットを作成する必要があります。週に週末がWednedayになると、毎週木曜日に11:00:00に休日が含まれていれば、週末はWednedayになります。これにより、EIA石油週間レポートのスケジュールが作成されます。私はxtsを使いたくない。時系列を週番号(N)のリストで条件付きでフィルタリングする

私はその日の曜日と時刻でサブセットする方法を知っています。しかし、私は日付のリストに存在する日付を含む週に条件付きをサブセット化する方法を知らない。どうすればいい?

以下のコードは、休日でフィルタリングすることなく、一日の曜日と時刻によってサブセットを作成します。また、フィルタとして使用する祝日のリストも含まれています。

#Make time sequence every 30mins with Time & DayWk columns 
Calendar30mn <- as.data.frame(seq(as.POSIXlt("2016/1/1 00:00:00"), as.POSIXlt("2016/12/31 23:59:59"), by="30 mins")) 
colnames(Calendar30mn) <- "DateTime" 
Calendar30mn$Time <- strftime(Calendar30mn$DateTime, format="%H:%M:%S") 
Calendar30mn$DayWk <- weekdays(Calendar30mn$DateTime) 

#List of US Federal holidays falling on Sunday/Monday/Tuesday/Wedneday 
FedHolidaysSuntoWed <- structure(c(16818, 16846, 16951, 16986, 17049, 17161, 17084), class = "Date") 

----- 

#Subset for Wednesday 10:30:00 
EIAOildates1 <- subset (Calendar30mn, Time == "10:30:00" & DayWk == "Wednesday") 

#Subset for Thursday 11:00:00 
EIAOildates2 <- subset (Calendar30mn, Time == "11:00:00" & DayWk == "Thursday") 

#Bind subsets and set reverse order (most recent at the top) 
EIAOildates <- rbind(EIAOildates1, EIAOildates2) 

上記コード水曜日午前10時30分00秒のためのサブセットを含むEIAOildates1を生成します。そのサブセットには、その週のいずれかの日がFedHolidaysSuntoWedに存在しない場合は、水曜日の10:30:30のみが含まれています。そして、逆さまはEIAOildates2です。

+0

私は、私は完全にあなたの質問を理解していないけど、あなたが使用することができれば、私は思っていました'lubridate'パッケージは、より具体的には' week'関数を使って週番号を生成します(例えば1から52/53)。曜日と週番号の両方を指定すると、データをグループ化できます。これがあなたが探しているものかどうかはわかりません。 – steveb

+0

ありがとうございます。それを調べます!ご迷惑をおかけして申し訳ありませんが、質問は明確ではありません。もっと明確にすることはできないと思っていますが、試してみます。 – Krug

+0

'lubridate'には日付が指定された間隔内にあるかどうかを調べるための素晴らしい機能があります。そのビネットを確認する – PavoDive

答えて

0

これが答えです:

library(lubridate) 

#Make time sequence every 30mins with Time & DayWk & WkNumber columns 
Calendar30mn <- as.data.frame(seq(as.POSIXlt("2016/1/1 00:00:00"), as.POSIXlt("2016/12/31 23:59:59"), by="30 mins")) 
colnames(Calendar30mn) <- "DateTime" 
Calendar30mn$Time <- strftime(Calendar30mn$DateTime, format="%H:%M:%S") 
Calendar30mn$DayWk <- weekdays(Calendar30mn$DateTime) 
Calendar30mn$WkNumber <- week(Calendar30mn$DateTime) 

#List of US Federal holidays falling on Sunday/Monday/Tuesday/Wedneday & Corresponding WkNumber 
FedHolidaysSuntoWed <- structure(c(16818, 16846, 16951, 16986, 17049, 17161, 17084), class = "Date") 
FedHolidaysSuntoWedWkNumber <- week(FedHolidaysSuntoWed) 

#Subset for Wednesday 10:30:00 
EIAOildates1 <- subset (Calendar30mn, Time == "10:30:00" & DayWk == "Wednesday" 
         & !(Calendar30mn$WkNumber %in% FedHolidaysSuntoWedWkNumber)) 

#Subset for Thursday 11:00:00 
EIAOildates2 <- subset (Calendar30mn, Time == "11:00:00" & DayWk == "Thursday" 
         & (Calendar30mn$WkNumber %in% FedHolidaysSuntoWedWkNumber)) 

#Bind and sort subsets 
EIAOildates <- rbind(EIAOildates1, EIAOildates2) 
EIAOildates <- EIAOildates[(order(as.Date(EIAOildates$DateTime))),] 

これはEIAOildatesの出力のサンプルです:

    DateTime  Time  DayWk WkNumber 
262 2016-01-06 10:30:00 10:30:00 Wednesday  1 
598 2016-01-13 10:30:00 10:30:00 Wednesday  2 
983 2016-01-21 11:00:00 11:00:00 Thursday  3 
1270 2016-01-27 10:30:00 10:30:00 Wednesday  4 
1606 2016-02-03 10:30:00 10:30:00 Wednesday  5 
1942 2016-02-10 10:30:00 10:30:00 Wednesday  6 
2327 2016-02-18 11:00:00 11:00:00 Thursday  7 
16726 2016-12-14 10:30:00 10:30:00 Wednesday  50 
17062 2016-12-21 10:30:00 10:30:00 Wednesday  51 
17447 2016-12-29 11:00:00 11:00:00 Thursday  52 
関連する問題