2016-03-18 219 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 
     }