在R中组合具有不同分辨率的时间序列数据

时间:2014-01-25 20:25:03

标签: r time-series

我已经读入并格式化了我的数据集,如下所示。

library(xts)

#Read data from file
x <- read.csv("data.dat", header=F)
x[is.na(x)] <- c(0)                        #If empty fill in zero

#Construct data frames
rawdata.h <- data.frame(x[,2],x[,3],x[,4],x[,5],x[,6],x[,7],x[,8]) #Hourly data
rawdata.15min <- data.frame(x[,10])                                #15 min data

#Convert time index to proper format
index.h <- as.POSIXct(strptime(x[,1], "%d.%m.%Y %H:%M"))      
index.15min <- as.POSIXct(strptime(x[,9], "%d.%m.%Y %H:%M"))

#Set column names
names(rawdata.h) <- c("spot","RKup", "RKdown","RKcon","anm", "pp.stat","prod.h")
names(rawdata.15min) <- c("prod.15min")                                                                   

#Convert data frames to time series objects
data.htemp <- xts(rawdata.h,order.by=index.h)
data.15mintemp <- xts(rawdata.15min,order.by=index.15min)

#Select desired subset period
data.h <- data.htemp["2013"]                 
data.15min <- data.15mintemp["2013"]

我希望能够将来自data.h$prod.h的每小时数据与对应于同一小时的data.15min$prod.15min的15分钟分辨率的数据合并。

一个例子是采用2013-12-01 00:00-01:00时的每小时值的平均值,以及同一小时内的最后15分钟值,即2013-12时的15分钟值-01 00:45-01:00。我正在寻找一种灵活的方式来实现这一目标。

有什么建议吗?

修改:进一步澄清:我想做类似的事情:

N <- NROW(data.h$prod.h)

for (i in 1:N){

prod.average[i] <- mean(data.h$prod.h[i] + #INSERT CODE THAT FINDS LAST 15 MIN IN HOUR i )

}

3 个答案:

答案 0 :(得分:1)

通过使用.index*包中非常有用的xts函数将15分钟数据转换为每小时数据,我找到了解决问题的方法,如下所示。

prod.new <- data.15min$prod.15min[.indexmin(data.15min$prod.15min) %in% c(45:59)]

这将创建一个新的时间序列,其中每小时仅显示45-59分钟间隔内的值。

对于那些好奇的人,我的数据看起来像这样:

原始每小时系列:

> data.h$prod.h[1:4]
2013-01-01 00:00:00 19.744
2013-01-01 01:00:00 27.866
2013-01-01 02:00:00 26.227
2013-01-01 03:00:00 16.013

原创15分钟系列赛:

> data.15min$prod.15min[1:4]
2013-09-30 00:00:00    16.4251
2013-09-30 00:15:00    18.4495
2013-09-30 00:30:00     7.2125
2013-09-30 00:45:00    12.1913
2013-09-30 01:00:00    12.4606
2013-09-30 01:15:00    12.7299
2013-09-30 01:30:00    12.9992
2013-09-30 01:45:00    26.7522

新系列,每小时只有最后15分钟:

> prod.new[1:4]
2013-09-30 00:45:00    12.1913
2013-09-30 01:45:00    26.7522
2013-09-30 02:45:00     5.0332
2013-09-30 03:45:00     2.6974

答案 1 :(得分:1)

简短回答

df %>%
   group_by(t = cut(time, "30 min")) %>%
   summarise(v = mean(value))

答案很长

由于您希望将15分钟时间序列压缩到较小的分辨率(30分钟),因此您应该使用dplyr包或任何其他计算&#34;组的包#34;概念

例如:

s  = seq(as.POSIXct("2017-01-01"), as.POSIXct("2017-01-02"), "15 min")
df = data.frame(time = s, value=1:97)

df是一个包含97行和两列的时间序列。

head(df)
                 time value
1 2017-01-01 00:00:00     1
2 2017-01-01 00:15:00     2
3 2017-01-01 00:30:00     3
4 2017-01-01 00:45:00     4
5 2017-01-01 01:00:00     5
6 2017-01-01 01:15:00     6

cut.POSIXtgroup_bysummarise函数可以完成工作:

df %>%
   group_by(t = cut(time, "30 min")) %>%
   summarise(v = mean(value))

                    t     v
1 2017-01-01 00:00:00   1.5
2 2017-01-01 00:30:00   3.5
3 2017-01-01 01:00:00   5.5
4 2017-01-01 01:30:00   7.5
5 2017-01-01 02:00:00   9.5
6 2017-01-01 02:30:00  11.5

答案 2 :(得分:0)

更强大的方法是通过取平均值将15分钟值转换为每小时值。然后做你想做的任何操作。

### 15 Minutes Data
min15 <- structure(list(V1 = structure(1:8, .Label = c("2013-01-01 00:00:00", 
                                                       "2013-01-01 00:15:00", "2013-01-01 00:30:00", "2013-01-01 00:45:00", 
                                                       "2013-01-01 01:00:00", "2013-01-01 01:15:00", "2013-01-01 01:30:00", 
                                                       "2013-01-01 01:45:00"), class = "factor"), V2 = c(16.4251, 18.4495, 
                                                                                                         7.2125, 12.1913, 12.4606, 12.7299, 12.9992, 26.7522)), .Names = c("V1", 
                                                                                                                                                                           "V2"), class = "data.frame", row.names = c(NA, -8L))
min15

### Hourly Data
hourly <- structure(list(V1 = structure(1:4, .Label = c("2013-01-01 00:00:00", 
                                                        "2013-01-01 01:00:00", "2013-01-01 02:00:00", "2013-01-01 03:00:00"
), class = "factor"), V2 = c(19.744, 27.866, 26.227, 16.013)), .Names = c("V1", 
                                                                          "V2"), class = "data.frame", row.names = c(NA, -4L))


hourly

### Convert 15min data into hourly data by taking average of 4 values
min15$V1 <- as.POSIXct(min15$V1,origin="1970-01-01 0:0:0")
min15 <- aggregate(. ~ cut(min15$V1,"60 min"),min15[setdiff(names(min15), "V1")],mean)

min15

names(min15) <- c("time","min15")
names(hourly) <- c("time","hourly")


### merge the corresponding values
combined <- merge(hourly,min15)

### average of hourly and 15min values
rowMeans(combined[,2:3])