【问题标题】:How do I match data frames by time intervals?如何按时间间隔匹配数据帧?
【发布时间】:2011-05-07 13:04:31
【问题描述】:

这是我从数据记录器导入原始数据时经常出现的问题。温度记录仪设置为每十分钟记录一次温度,单独的气体记录仪设置为记录最后十分钟间隔内使用的气体。我想将这两个记录器的数据组合到一个数据框中进行绘图和分析,但时间并不完全一致。我希望每十分钟在数据框中有一行,日期时间显示时间段的开始。

温度记录器数据如下所示:

           datetime temperature
2010-09-30 06:58:53 78.996
2010-09-30 07:08:53 78.645
2010-09-30 07:18:53 78.514
2010-09-30 07:28:53 79.173
2010-09-30 07:38:53 78.602

气体记录仪数据如下:

           datetime gas
2010-09-30 13:45:00  0
2010-09-30 13:55:00  1
2010-09-30 14:05:00  0
2010-09-30 14:15:00  4
2010-09-30 14:25:00  2

我想以十分钟的间隔合并两个数据帧,这样合并后的数据看起来像:

           datetime temperature gas  
2010-09-30 13:40:00 NA          0
2010-09-30 13:50:00 78.996      1
2010-09-30 14:00:00 78.645      0
2010-09-30 14:10:00 78.514      4
2010-09-30 14:20:00 79.173      2
2010-09-30 07:38:53 78.602      NA

下面是获取这两个数据框的一些代码:

temps <- data.frame(datetime=c("2010-09-30 06:58:53",
"2010-09-30 07:08:53","2010-09-30 07:18:53",
"2010-09-30 07:28:53","2010-09-30 07:38:53"),
 temperature=c(78.996,78.645,78.514,79.173,78.602),
stringsAsFactors=FALSE)
temps$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
gas <- data.frame(datetime=c("2010-09-30 13:45:00",
"2010-09-30 13:55:00","2010-09-30 14:05:00",
"2010-09-30 14:15:00","2010-09-30 14:25:00"),
gas=c(0,1,0,4,2),stringsAsFactors=FALSE)
gas$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")

【问题讨论】:

    标签: r zoo xts


    【解决方案1】:

    xts 中使用align.time

    library(xts)
    xTemps <- align.time(xts(temps[,2],as.POSIXct(temps[,1])), n=600)
    xGas <- align.time(xts(gas[,2],as.POSIXct(gas[,1])), n=600)
    merge(xTemps,xGas)
    

    【讨论】:

      【解决方案2】:

      使用zooxts 之一来保存您的数据——他们的merge() 函数将为您完成此操作。您可以在此处查找以前的答案。 zoo 文档也有很多相关示例。

      这是一个模型示例:

      > set.seed(42)
      > temps <- zoo(78+rnorm(5), 
      +              order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
      > gas <- zoo(sample(1:5,5), 
      +            order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
      > merge(temps,gas)
                           temps gas
      2010-09-30 06:59:47 78.048  NA
      2010-09-30 06:59:49     NA   5
      2010-09-30 07:00:44 76.895  NA
      2010-09-30 07:00:48     NA   1
      2010-09-30 07:00:55     NA   3
      2010-09-30 07:01:01 78.539  NA
      2010-09-30 07:01:23     NA   2
      2010-09-30 07:01:51 78.580  NA
      2010-09-30 07:01:57     NA   4
      2010-09-30 07:02:29 77.342  NA
      > na.locf(merge(temps,gas))
                           temps gas
      2010-09-30 06:59:49 78.048   5
      2010-09-30 07:00:44 76.895   5
      2010-09-30 07:00:48 76.895   1
      2010-09-30 07:00:55 76.895   3
      2010-09-30 07:01:01 78.539   3
      2010-09-30 07:01:23 78.539   2
      2010-09-30 07:01:51 78.580   2
      2010-09-30 07:01:57 78.580   4
      2010-09-30 07:02:29 77.342   4
      > 
      

      【讨论】:

      • 感谢您提供动物园文档链接。
      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2017-05-09
      • 2021-05-07
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 2017-01-29
      • 2021-07-18
      相关资源
      最近更新 更多