我的dataframe的列名是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)
每个日期有48个固定的半小时窗口。(实际上你的窗户是固定的,甚至不能滑动。)看起来像一个交易数据集,所以你只想要从09:00-09:30到15:30-16:00(?)的时间窗口,因此每个日期只有14个窗口。
您只需使用lubridate::interval
创建这些日期时间窗口,然后使用dplyr/data.table
进行拆分应用组合(聚合)以获得每个窗口内的平均值。
如果你张贴一个可复制的例子,我会张贴代码。
一点:
- 请注意,如果窗口是空的,无论您是希望平均值为0,而不是NA,还是那些(市场关闭的)窗口应该从结果中省略。您还希望排除周末和市场假期。如果你的数据稀疏,你必须自己构建这些日期。
正如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")