2016-03-18 211 views
1

我有時間序列(xts格式化)在10分鐘時速度電力消費數據從時間序列對象中提取前一天值R中

     power 
2015-08-01 00:00:00 101.22    
2015-08-01 00:10:00 122.941     
2015-08-01 00:20:00 67.596    
2015-08-01 00:30:00 184.180  

現在我想3個列添加到它:

  1. 列#2:「prevday1」 - 在「prevday1」將包含前一天的功耗讀數在同一時間。也就是說,如果當前指數是2015年8月5日1100小時,那麼「prevday1」應該包含同一時刻(2015年8月4日,1100小時)的前一天消費
  2. 第3列:「Prevday2」 - 其中「prevday2 「將包含同一時刻前一天前一天的功耗讀數
  3. 第4列:」previnstant1「 - 其中」previnstant1「將包含前一時刻的讀數。在我的情況下,這將是前10分鐘

不知何故新xts對象會像

    power  prevday1  prevday2 previnstant1 
2015-08-01 00:00:00 101.22  NA   NA   NA 
2015-08-01 00:10:00 122.941  :   :   : 
2015-08-01 00:20:00 67.596    
2015-08-01 00:30:00 184.180 
     : 

現在能耗的問題是我應該如何提取從3列2和4的值歷史xts對象。我開始使用.indexday類型的函數,但無法獲取值。 R中是否有任何特定功能使用xts索引提取這些類型的值?

+0

滯後(xts_object,24 * 6)給你的前一天,滯後(xts_object,48 * 6)給出prevday2等。這是假設你忽略日光的節省時間。 – user3293236

+0

lag(xts_object,1)給你以前的時刻。 – user3293236

+0

否,'lag()'返回整個對象,並返回指定的具有'na'的一些觀察值。我需要對應於以前特定時間戳的值。 –

回答

0

經過一整天的努力,我出來了一種方式填補剩下的三欄。其做法是:的當前觀測

  1. 提取物/讀取索引
  2. 使用步驟的索引對應於步驟2。這將填充柱的指數1
  3. 讀取的值計算前兩天的索引2和3分別爲
  4. 查找時間序列數據的週期性並使用此週期性讀取以前的值。這將填補列

代碼是:

#x is a xts time series object containing columns as shown in question 
dates <- as.Date(index(x),tz="Asia/Kolkata") # timestamp in date format 
for(i in 0:200) # no. of observations 
     { 
     a <- x[i,1] # Current observation 
     prev_d1 <- as.Date(index(a), tz ="Asia/Kolkata")-1 # previous day 
     prev_d2 <- as.Date(index(a), tz ="Asia/Kolkata")-2 # previous to previous day 
     prev_value1 <- x[dates %in% prev_d1 & .indexhour(x) %in% .indexhour(a) & .indexmin(x) %in% .indexmin(a)]$power 
     prev_value2 <- x[dates %in% prev_d2 & .indexhour(x) %in% .indexhour(a) & .indexmin(x) %in% .indexmin(a)]$power 
     x[i,"prevday1"] <- if(length(prev_value1)!=0) prev_value1 else NA 
     x[i,"prevday2"] <- if(length(prev_value2)!=0) prev_value2 else NA 
     x[i,"previnstant1"] <- ifelse(length(x[index(a)-frequency]$power)!=0, x[index(a)-frequency]$power, NA)# frequency represents periodicity values in terms of seconds 
     }