2015-08-14 49 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

相關問題