时间戳的半小时窗口中的字段平均值

时间:2015-08-11 03:28:37

标签: r timestamp average sliding-window

我的数据框有列名Timestamp, es,如下所示:

          Timestamp     es
2015-04-01 09:07:42     31
2015-04-01 09:08:01   29.5
2015-04-01 09:15:03   18.5
2015-04-01 09:15:05    8.8
2015-04-01 09:15:09    9.6

时间一直持续到15:30:30(每天每个时间戳大约12000 es个数据点)和相应的es。

R是否在某些包或代码中具有某些功能,以便在半小时内平均所有时间戳的es。示例输出应如下所示:

2015-04-01 09:30:00 Value(Average of all es from 9:00 to 9:30)
2015-04-01 10:00:00 Value(Average of all es from 9:30 to 10:00)
2015-04-01 10:30:00 Value(Average of all es from 10:00 to 10:30)
... (the list goes on till 15:30:30)

2 个答案:

答案 0 :(得分:0)

每个日期有48个这样的固定半小时窗口。 (实际上你的窗户是固定的,甚至没有滑动。)看起来像一个交易数据集,所以你只想要从09:00-09:30到15:30-16:00(?)的时间窗口,因此只有14个窗口每个日期。

您只需使用lubridate::interval创建这些日期时间窗口,然后使用dplyr/data.table执行split-apply-combine(聚合)以获取每个窗口中的平均值。

如果您post a reproducible example我发布了代码。

有一点:

  • 如果窗口为空,请注意是否要求平均值为0,而不是NA,否则应从结果中省略这些(市场关闭的)窗口。您还想排除周末和市场假期。如果您的数据稀少,您将不得不自己构建这些日期。

答案 1 :(得分:0)

正如smci警告的那样,您添加的有关数据的信息越少,帮助就越有限。这是一种base R方法,可以从提供的日期创建30分钟的间隔。因此,不会出现空间隔(取决于您所需的输出,这可能有用或无效)。聚合函数按期望的组间隔应用均值。我扩展了您的示例以包含更多测试间隔:

cuts <- seq(round(min(df$Timestamp), "hours"), max(df$Timestamp)+30*60, "30 min")
aggregate(df$es, list(cut(df$Timestamp, cuts)), mean)
#              Group.1     x
#1 2015-04-01 09:00:00 31.00
#2 2015-04-01 10:00:00 29.50
#3 2015-04-01 11:00:00 13.65
#4 2015-04-01 13:00:00  9.60

数据

df <- structure(list(Timestamp = structure(c(1427893662, 1427897281, 
1427901303, 1427901605, 1427908509), class = c("POSIXct", "POSIXt"
), tzone = ""), es = c(31, 29.5, 18.5, 8.8, 9.6)), .Names = c("Timestamp", 
"es"), row.names = c(NA, -5L), class = "data.frame")