我有时间序列数据(分钟数据)。我想用R计算每30分钟数据的平均值,而我不想计算移动平均线。
数据如下:
data date
1 0.138685809 2016-08-13 15:17:01.152
2 1.724535157 2016-08-13 15:23:09.153
3 3.691574663 2016-08-13 15:29:17.139
4 11.225038913 2016-08-13 15:35:25.131
5 2.415299764 2016-08-13 15:41:33.132
6 0.569204804 2016-08-13 15:47:41.136
7 9.324725292 2016-08-13 15:53:49.137
8 17.232072439 2016-08-13 15:59:57.140
9 20.876006587 2016-08-13 16:06:05.140
10 10.911137327 2016-08-13 16:12:13.144
答案 0 :(得分:0)
嗯,我不知道一些非常优雅的解决方案,但有一种可能性:
让我们说你的数据是这样的:
value date time
1 0.1386858 2016-08-13 15:17:01.152
2 1.7245352 2016-08-13 15:23:09.153
3 3.6915747 2016-08-13 15:29:17.139
4 11.2250389 2016-08-13 15:35:25.131
5 2.4152998 2016-08-13 15:41:33.132
6 0.5692048 2016-08-13 15:47:41.136
7 9.3247253 2016-08-13 15:53:49.137
8 17.2320724 2016-08-13 15:59:57.140
9 20.8760066 2016-08-13 16:06:05.140
10 10.9111373 2016-08-13 16:12:13.144
从你的角色变量创建时间变量
library(chron)
data$time <- chron(times = data$time)
计算时间差异,然后应用累计和
time_spent <- c(0, cumsum(diff(data$time)))
data$time_spent <- chron(times = time_spent)
然后将time_spent
变量切换为30分钟间隔
data$time_parts <- cut(data$time_spent,
c(seq(times(0), max(data$time_spent), by = times(30/(60*24))), max(data$time_spent)),
include.lowest = T)
最后计算每30分钟间隔的平均值:
aggregate(data$value, by = list(data$time_parts), FUN = mean)
希望这有帮助。
编辑:您还可以找到一些灵感here
答案 1 :(得分:0)
我有一个使用data.table的答案。 我们的想法是创建一个列,为每个30分钟切片提供索引,然后使用by函数计算每张幻灯片的平均值。 这是有效的,需要两行:
library(data.table)
DT <- setDT(yourdataframe)
DT[,datepos := as.POSIXct(date,format = "%Y-%m-%d %H:%M:%OS")] { just to have a standart format
DT[,datediffindex := as.numeric((datepos - .SD[1,datepos])/60 )%/% 30]
这里我创建了datediffindex列,它是每个30分钟数据片段的索引。 SOI计算时间列与其第一个值之间的差异,我将每60分为几分钟,然后取每30分区的整数,这就是你的指数 然后我们只需要对索引的每个值进行均值:
DT[, datamean := mean(data), by = datediffindex]
它提供了你想要的东西
data date datepos datediffindex datamean
1: 0.1386858 2016-08-13 15:17:01.152 2016-08-13 15:17:01 0 3.839027
2: 1.7245352 2016-08-13 15:23:09.153 2016-08-13 15:23:09 0 3.839027
3: 3.6915747 2016-08-13 15:29:17.139 2016-08-13 15:29:17 0 3.839027
4: 11.2250389 2016-08-13 15:35:25.131 2016-08-13 15:35:25 0 3.839027
5: 2.4152998 2016-08-13 15:41:33.132 2016-08-13 15:41:33 0 3.839027
6: 0.5692048 2016-08-13 15:47:41.136 2016-08-13 15:47:41 1 11.782629
7: 9.3247253 2016-08-13 15:53:49.137 2016-08-13 15:53:49 1 11.782629
8: 17.2320724 2016-08-13 15:59:57.140 2016-08-13 15:59:57 1 11.782629
9: 20.8760066 2016-08-13 16:06:05.140 2016-08-13 16:06:05 1 11.782629
10: 10.9111373 2016-08-13 16:12:13.144 2016-08-13 16:12:13 1 11.782629