我是这样处理的:
- 使用所有 1 秒的时间戳构建时间序列“X”,即没有间隙。
- 从数据框“data”中填写测量值。
- 使用时间序列“X”中的数据计算 10 分钟统计数据并将结果写入新的时间序列“Y”。
- 从“Y”中删除缺少某些数据的行。
.
library(timeDate)
library(timeSeries)
data <- read.table( filename, header=TRUE )
########################################################################
# Build a timeSeries "X" from the data.frame "data":
tm <- as.timeDate( strptime(paste(as.character(data$date),as.character(data$time)),
format="%Y-%m-%d %H:%M:%S.00",
tz = "GMT"),
zone = "GMT")
t <- timeSequence(start(tm),end(tm),by="secs")
X <- timeSeries( data.frame( speed = rep(NA,length(t)),
angle = rep(NA,length(t)) ) )
setTime(X) <- t
X[tm]$speed <- data$speed
X[tm]$angle <- data$angle
#----------------------------------------------------------------
# Restrict the timestamps to 10 minute steps:
m <- seq( from = which.max(format(t[601:length(t)],"%M:%S")=="00:00"),
to = length(t),
by = 600 )
#----------------------------------------------------------------
# Calculate 10 minute statistics:
Y <- timeSeries( data.frame(
speed_avg = sapply(m,function(m){mean(na.omit(X$speed[(m-599):m]))}),
speed_sd = sapply(m,function(m){sd(na.omit(X$speed[(m-599):m]))}),
speed_min = sapply(m,function(m){min(na.omit(c(X$speed[(m-599):m],Inf)))}),
speed_max = sapply(m,function(m){max(na.omit(c(X$speed[(m-599):m],-Inf)))}),
angle_avg = sapply(m,function(m){mean(na.omit(X$angle[(m-599):m]))}) ) )
setTime(Y) <- t[m]
Y <- Y[complete.cases(Y),]
write.table(Y,filename_10min)
由于需要大量数据,我使用以下脚本创建示例数据:
library(timeDate)
#######################################################################
# Create example data
set.seed(1)
t_start <- as.timeDate("2015-01-01 00:00:00")
t_end <- as.timeDate("2015-01-03 13:00:00")
t <- timeSequence(t_start,t_end,by="sec")
data <- data.frame( date = format(t,"%Y-%m-%d"),
time = format(t,"%H:%M:%S.00"),
speed = 6 + sin((1:length(t))/500) + sample(-10:10,length(t),replace=TRUE)/15,
angle = sample(-900:900,length(t),replace=TRUE)/10 )
# Some values are missing:
data[8823:11580,] <- NA
data[13585:18801,] <- NA
data[sample(1:nrow(data),0.1*nrow(data)),] <- NA
data <- na.omit(data)
write.table( data, filename, quote=FALSE, row.names=FALSE )