不完整时间序列数据的移动平均值

4
我有一个随时间变化的数据集(为期两个月)。深度之间的最小时间间隔小于1分钟,最大时间间隔为几天。在R中,我想基于每个观测值周围的6小时(或12小时)时间窗口计算深度的移动平均值(不是基于滞后/超前的观测次数的窗口)。
我尝试了zoo包,但我似乎无法让rollmean起作用。
我的数据的一个小子集是: https://www.dropbox.com/s/lhhrdgt2mxasc9v/fid57.depth.test1.csv 在R中是这样的:
> str(my.data)
'data.frame':   51 obs. of  2 variables:
 $ DateTime: POSIXct, format: "2013-08-07 06:49:46" "2013-08-07 06:55:17" "2013-08-07" 07:06:52" "2013-08-07 07:23:43" ...
 $ Depth   : num  28.6 31.7 29 35.2 33 ...

 >head(my.data)
DateTime "Depth"
2013-08-07 06:49:46 28.58
2013-08-07 06:55:17 31.7
2013-08-07 07:06:52 29.02
2013-08-07 07:23:43 35.18
2013-08-07 07:27:14 32.98
2013-08-07 08:20:21 55.84

> dput(head(my.data))
structure(list(DateTime = structure(c(1375883386, 1375883717, 
1375884412, 1375885423, 1375885634, 1375888821), class = c("POSIXct", 
"POSIXt"), tzone = ""), Depth = c(28.58, 31.7, 29.02, 35.18, 
32.98, 55.84)), .Names = c("DateTime", "Depth"), row.names = c(8481L, 
8483L, 8484L, 8485L, 8487L, 8495L), class = "data.frame")

任何建议都将不胜感激。
非常感谢!

请将 dput(head(my.data)) 的输出添加到问题中。 - Matthew Lundberg
我认为 rollapply 在这里不适用于由于窗口大小的变化,但是由于您正在寻找计算平均值,因此您应该能够想出跟踪滚动六小时窗口的快速算法。请参见此讨论 - BrodieG
这个(https://dev59.com/qGIj5IYBdhLWcg3wilvB#20137464)能回答你的问题吗?我认为它可能可以。它应该能在几毫秒内给出你的答案。虽然你的问题措辞不同,但我认为这两个问题本质上是在问同一件事情。 - kdauria
2个回答

2

这不是你要求的,但是以防万一,如果只是将其分为6小时不重叠的时间段,并在其中进行平均,则可以使用以下代码:

library(zoo)

z <- read.zoo("fid57.depth.test1.csv", header = TRUE, 
              index = 1:2, format = "%Y-%m-%d %H:%M:%S", tz = "")
z6 <- aggregate(xx, as.POSIXct(cut(time(z), "6 hours")), mean)

给出这个:

> z6
2013-08-07 06:00:00 2013-08-07 12:00:00 2013-08-07 18:00:00 2013-08-08 00:00:00 
           43.40810            39.13500            22.31250            17.38333 
2013-08-08 06:00:00 2013-08-08 12:00:00 2013-08-08 18:00:00 2013-08-09 00:00:00 
                 NA            15.53333                  NA                  NA 
2013-08-09 06:00:00 2013-08-09 12:00:00 
                 NA            23.30455 

如果不想要 NA 条目,请使用 na.omit(z6)

另外请注意,输入文件的扩展名为.csv,但它不是一个 csv 文件。

上面示例中使用的数据如下:

"DateTime ""Depth"""
2013-08-07 06:49:46 28.58
2013-08-07 06:55:17 31.7
2013-08-07 07:06:52 29.02
2013-08-07 07:23:43 35.18
2013-08-07 07:27:14 32.98
2013-08-07 08:20:21 55.84
2013-08-07 09:05:35 47.05
2013-08-07 09:10:28 65.96
2013-08-07 09:37:21 40.01
2013-08-07 09:44:59 47.05
2013-08-07 09:58:30 43.53
2013-08-07 10:02:45 47.49
2013-08-07 10:07:23 47.93
2013-08-07 10:11:31 56.28
2013-08-07 10:15:38 61.12
2013-08-07 10:19:39 53.2
2013-08-07 10:27:28 43.53
2013-08-07 10:31:44 40.89
2013-08-07 10:45:19 31.2
2013-08-07 10:47:29 31.7
2013-08-07 10:49:44 41.33
2013-08-07 12:01:00 33.86
2013-08-07 12:05:06 35.62
2013-08-07 17:25:35 43.53
2013-08-07 17:40:25 43.53
2013-08-07 18:15:03 42.65
2013-08-07 21:29:33 16.3
2013-08-07 22:05:15 14.9
2013-08-07 22:07:44 15.4
2013-08-08 02:18:36 16.3
2013-08-08 02:23:26 16.3
2013-08-08 03:34:21 16.3
2013-08-08 03:55:46 16.7
2013-08-08 05:05:53 17.6
2013-08-08 05:10:27 21.1
2013-08-08 15:36:02 16.7
2013-08-08 16:12:20 12.8
2013-08-08 16:16:55 17.1
2013-08-09 13:17:04 22.4
2013-08-09 13:22:32 21.1
2013-08-09 13:25:58 24.2
2013-08-09 13:37:01 15.4
2013-08-09 13:40:16 14.1
2013-08-09 13:46:46 14.1
2013-08-09 13:54:31 27.26
2013-08-09 14:18:53 40.89
2013-08-09 14:22:34 21.5
2013-08-09 14:26:52 28.14
2013-08-09 14:36:35 27.26

0
我推荐使用runner软件包和内置函数mean_run。你的问题在vignette中的Window depending on date部分有描述。 以下是7天平均值的示例。
# random value and irregular data generation
x <- runif(15)
date <- as.Date(cumsum(rpois(n = 15, lambda = 2)), origin = Sys.Date())

library(runner)
mean_run(x, k = 7, idx = date)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接