【问题标题】:Combining time series data with different resolution in R在R中组合具有不同分辨率的时间序列数据
【发布时间】:2014-02-16 19:30:54
【问题描述】:

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

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 )

}

【问题讨论】:

  • 您能否提供您的数据样本以及所需结果的示例?每小时和 15 分钟数据的行数是否相同?而您希望每个小时只占用最后 15 分钟?
  • 我发布了一个我找到的潜在解决方案的编辑。
  • 见?to.period、?merge.xts、?na.locf、?period.apply。也许this helps。如果没有,那么将您的数据设为reproducible 将大大有助于获得答案。
  • 感谢您的意见!我现在看到有几种方法可以解决这个问题,例如to.period 与我的解决方案几乎相同(参见最后的编辑)。
  • 您可以回答自己的问题。您可以离开上面的问题部分,并移动作为您答案的解决方案。这样可以将问题标记为完成。

标签: r time-series


【解决方案1】:

我找到了解决问题的方法,方法是使用 xts 包中非常有用的 .index* 函数将 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

【讨论】:

    【解决方案2】:

    简答

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

    长答案

    由于您想将 15 分钟的时间序列压缩为更小的分辨率(30 分钟),您应该使用 dplyr 包或任何其他计算“分组依据”概念的包。

    例如:

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

    df 是一个有 97 行和 2 列的时间序列。

    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.POSIXt、group_by 和 summarise 函数可以完成工作:

    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
    

    【讨论】:

      【解决方案3】:

      一种更可靠的方法是通过取平均值将 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])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2020-02-18
        • 2015-01-20
        • 2016-09-04
        • 2011-01-02
        • 2018-06-23
        • 2020-10-13
        相关资源
        最近更新 更多