2012-03-28 27 views
4

我試圖在XTS中生成跨日子時間序列。如何通過R中的xts從每分鐘的數據中提取/子集的第+天到第+天的索引時間?

例如,假設我有一個每10小時一天24小時生成的詳細時間序列(mts)。我想提取時間序列中的每一天(上午08:30上午t + 0到13:30 t + 1)期間。

要與XTS同日08:30,比方說,16:00做,這是瑣碎和StackExchange很好的解決:即mts["T08:29:59/T16:01:00"]

但我怎麼寫相當於其中的端點時間序列是第二天發生的時間?

任何想法非常讚賞。

+0

上午8點30分到下午1點30分在第二天,每天的第一天8點30分到最後一天13點30分之間的所有數據。如果你只是想要這樣做,說2012年1月1日,它是'mts [「2012-01-01 08:30/2012-01-02 13:30」]' – GSee 2012-03-28 15:40:30

+0

我正在尋找這樣做10年系列中所有日子的具體子時期。如果我在原始問題中沒有明確說明,請諒解 – 2012-03-28 15:46:52

+0

正確,但由於子時段重疊,您將在第一天的8:30和最後一天的13:30之間留下所有數據。 – GSee 2012-03-28 15:53:14

回答

4

這將創建一個列表,其中列表的每個元素都是一個xts對象,該對象在8:30開始,並在第二天的13:30結束。

D <- split(mts, "days") 
mts.days <- lapply(seq_along(D) - 1, function(i) { 
    if (i > 0) rbind(D[[i]]["T08:30/T23:59:59"], D[[i + 1]]["T00:00:00/T13:30:00"]) 
}) 

編輯: 以上可以通過添加名稱列表擴展:

names(mts.days) <- as.Date(sapply(D, function(x) as.Date(start(x)))) 

然後,您可以參考該數據,從早上8:30 2012-01-30直到下午1點半在2012-01-31這樣

mts.days[["2012-01-30"]] 

或者,如果你只是要拉出一個「天」,你可以做這樣的事情(即遵循相同的基本邏輯)

PullDay <- function(Date="2012-01-30", t0="08:30", t1="13:30", mts=mts) { 
    string1 <- paste(Date, " ", t0, "/", Date, " 23:59:59", sep="") 
    string2 <- paste(as.Date(Date) + 1, " 00:00:00/", as.Date(Date) + 1, " ", t1, sep="") 
    rbind(mts[string1], mts[string2]) 
} 

然後,PullDay("2012-01-30")將爲您提供2012-01-30 08:30/2012-01-31 13:30的數據子集。

EDIT2:這簡化了

PullDay <- function(Date="2012-01-30", t0="08:30", t1="13:30", mts=mts) { 
    mts[paste(Date, " ", t0, "/", as.Date(Date) + 1, " ", t1, sep="")] 
} 

這使我相信,我可能還是不明白你想要什麼...

+0

這是一個有趣的解決方案,巧妙地放在一起,但列表格式不適用於我想要做的分析。就像'xts'一樣,我想最終得到這個子集的連續時間序列。儘管如此,非常感謝你的嘗試;非常感激。 – 2012-03-28 19:21:52

+0

我已經在2條評論中提供瞭解決方案。如果你認爲你想要的不同於根本沒有對你的數據進行子集化(除了第一天和最後一天),那麼請解釋你想要的。你想從上午8點30分到下午1點30分複製姓名每天? – GSee 2012-03-28 19:35:07

+0

恐怕我不明白你在其他兩條評論中暗示的答案。我假設我沒有正確地傳達一些信息。 時間不僅是從08:30 t0到13:30 t + 1的每分鐘。這是一個24小時的時間序列。我只是試圖在兩天內抽出一個明確的子時期。從明天的09:00:00到明天的07:00:00可能很容易。 – 2012-03-28 20:11:05

0

我一直在尋找的答案,這個問題我自己。 GSee的答案是完美的。但是由於沒有提供數據,我自己做了。在這個過程中,這個過程稍微適應了GSee的代碼。對於OP,請選擇GSee的答案,因爲它可以回答你的問題。下面的代碼僅供參考,如果有人有興趣在這個問題(包括我的未來的自己):

創建了一個爲期3天的週期開始於8:30結束在13:30的XTS對象:

ticks <- 24*60*10 
mts <- xts(runif(ticks,0,1) 
       , order.by = seq(as.POSIXct("2013-01-01 08:30:00") 
           , as.POSIXct("2013-01-03 13:30:00") 
           , length = ticks 
          ) 
     ) 


D <- split(mts, "days") 
D[1]; D[2]; D[3]; 

GSEE的功能從XTS對象中提取數據:

PullDay <- function(x, d0 = "2013-01-01", d1 = "2013-01-03", t0 = "08:30", t1 = "13:30") 
{ 
    x[paste0(d0, " ", t0, "/", d1, " ", t1)] 
} 

從上午8:30拉動2013年1月2日的數據,直到下午1:30在同一天,做:

PullDay(mts, d0="2013-01-02", d1="2013-01-02") 

要指定確切的範圍,這樣做:

PullDay(mts, d0="2013-01-02", d1="2013-01-02", t0="09:00", t1="09:01") 

如果有人察覺的錯誤,你必須編輯的權限,正確的。

+0

我的[qmao包](https://r-forge.r-project.org/R/?group_id=1113)具有某種相關功能:[TimeOfDaySubset](https://r-forge.r-project .org/scm/viewvc.php/pkg/qmao/R/TimeOfDaySubset.R?view = markup&root = twsinstrument),[ExcludeTimes](https://r-forge.r-project.org/scm/viewvc.php/ pkg/qmao/R/ExcludeTimes.R?view = markup&root = twsinstrument),[ExcludeDates](https://r-forge.r-project.org/scm/viewvc.php/pkg/qmao/R/ExcludeDates.R ?視圖=標記&根= twsinstrument)。 – GSee 2013-04-01 21:33:12

+0

謝謝GSee,我對R很新,還沒有探索過很多。我會閱讀這些。謝謝! – PatrickT 2013-04-02 19:39:30

相關問題