2015-08-14 59 views
0

我每秒钟都会测量风速和风向。我需要将数据减少到10分钟平均值,同时节省最小值,最大值和sd值。使用时间戳记1秒数据到10分钟统计信息

10分钟的程序段应该在特定的时间间隔,例如时间10:10和10:20之间应该在新的数据帧中有时间戳10:20。 有时候测量有间隙,因此应该丢弃少于600次测量的10'周期。 这里是输入数据框的样子:

 date  time speed  angle 
1 2015-02-24 10:33:20.00 7.415 -17.65045166 
2 2015-02-24 10:33:21.00 6.650 0.06921746 
3 2015-02-24 10:33:22.00 6.650 -19.54238892 
4 2015-02-24 10:33:23.00 7.415 -46.76791382 
5 2015-02-24 10:33:24.00 6.650 84.60681152 
6 2015-02-24 10:33:25.00 6.650 7.41780472 

这是它应该看看到底是什么:

date  time speedAvg angleAvg speedMax speedMin speedSd 
1 2015-02-24 10:30:00 
2 2015-02-24 10:40:00 
3 2015-02-24 10:50:00 
4 2015-02-24 11:00:00 
5 2015-02-24 11:10:00 
6 2015-02-24 11:20:00 

所以,我认为,要做到这一点的方法是使用功能的子集在日期时间变量上创建一个可用于计算值的数据帧。在循环结尾使用rbind。 我无法弄清楚如何在特定的时间间隔上使用子集。 此外,建议是一个更优雅的解决方案,欢迎。

+0

好像我不能编辑我自己的问题...: - /我忘了提到我在使用R.我不允许给出更具体的标签,因为我没有制作新标签的声望。 –

回答

0

我如下进行:

  1. 生成以时间序列“X”与所有1秒时间戳,即没有间隙。
  2. 从数据框“数据”中填入测量值。
  3. 使用时间序列“X”中的数据计算10分钟统计量并将结果写入新的时间序列“Y”。
  4. 删除某些数据丢失的“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) 
0

你可以做到这一点很容易地使用dplyr通过执行以下操作:

  1. 为每行在10分钟间隔开始时间(小时和分钟)内创建数据框中的新列。
  2. 使用dplyr函数可以轻松地聚​​合数据,并过滤出数据少于600个时间点的行。 here is a quick intro to dplyr 假设您的数据存储在一个对象调用X:

library(dplyr) 
X$time <- as.character(X$time) 
X$hourmin <- substr(X$time, 1, 4) 
X$time <- paste(X$hourmin, "0:00", sep = "") 
X <- X %>% group_by(date, time) 
     %>% summarize(
      speedAvg = mean(speed, na.rm=T) 
      ,angleAvg = mean(angle, na.rm=T) 
      ,speedMax = max(speed, na.rm=T) 
      ,speedMin = min(speed, na.rm=T) 
      ,speedSd = sd(speed, na.rm=T) 
      ,datapoint_count = n()) 
    %>% filter(datapoint_count >= 600)) 

#remove datapoint_count column. 
X <- X[, -8] 
+0

“datapoint_count> 0”,而不是“datapoint_count> = 600”。 – mra68

+0

@ mra68为什么data_point> 0,他确实表示他希望丢弃10分钟的时间间隔,但观察次数少于600次,因此data_point> = 600。data_point计算每10分钟间隔内的观测总数。 – FelixNNelson

+0

恐怕“data_point> = 600”几乎什么都不会生存。如果缺少1秒钟,没有理由丢掉洞10分钟。 – mra68

相关问题