2016-11-24 33 views
2

我有一個從Hobo站收集的大量氣象數據,它有它自己的軟件,但很難在那裏處理它。所以,我只是將所有信息附加在下降數據框中,但現在我一直在閱讀以瞭解如何獲得小時結果。已嘗試與Plyr和lubridate包尚未成功。我是R的新手程序員,通常從互聯網上找到的工作補丁構建代碼。R - 從非恆定頻率數據採集中獲取每小時平均值

所以,我已經有了如下:

data<-read.csv("file.txt",header=TRUE,sep=";",dec=".",stringsAsFactors=FALSE) 
    data<-data[-1,] 

    data$TIMETAMP <- strptime(data$TIMETAMP, format="%d-%m-%y %H:%M",   tz=Sys.timezone(location=TRUE)) 

    data$Vel_VIENTO<-as.numeric(as.character(data$Vel_VIENTO)) 
    data$Vel_RAFAGAS <-as.numeric(as.character(data$Vel_RAFAGAS)) 
    data$Temp_Amb <-as.numeric(as.character(data$Temp_Amb)) 

    data$HR <-as.numeric(as.character(data$HR)) 
    data$Temp_Agua <-as.numeric(as.character(data$Temp_Agua)) 
    data$Presion <-as.numeric(as.character(data$Presion)) 

    data$Radiacion <-as.numeric(as.character(data$Radiacion)) 
    data$Dir_VIENTO <-as.numeric(as.character(data$Dir_VIENTO)) 

數據如下所示:

 REGISTRO    FECHA Vel_VIENTO Vel_RAFAGAS Temp_Amb HR Temp_Agua 
    2  1 2015-01-08 15:03:00  6.30  7.55 20.579 58.5 23.472 
    3  2 2015-01-08 15:18:00  6.55  9.07 20.412 57.5 22.609 
    4  3 2015-01-08 15:33:00  6.80  8.56 21.413 54.7 23.761 
    5  4 2015-01-08 15:48:00  6.30  8.31 20.222 59.5 22.705 
    6  5 2015-01-08 16:03:00  6.55  8.31 20.246 58.6 22.298 
    7  6 2015-01-08 16:18:00  7.30  9.57 19.008 63.5 21.366 
     Presion Radiacion Dir_VIENTO 
    2 906.55  NA   NA 
    3 906.15  NA   NA 
    4 905.95  NA   NA 
    5 906.05  NA  202.2 
    6 906.05  966.9  210.6 
    7 905.75  919.4  227.4 

所以每列有數據$ TIMESTAMP一個TIMESTAMP一個參數。數據的頻率範圍從數據幀中的每15分鐘到每30分鐘。我想獲得data.frame中每個參數的每小時平均值的相同表格。

回答

0

首先,如果您可以(將來)包含代碼片段,以便我們爲您提供可重現的解決方案,那將是非常好的。

作爲一種可能的解決辦法,我建議有一個看dplyr包,有日期,時間和時間以及根據日期和時間最後組的一切單獨的列來計算每小時平均:

library(stringr) 
library(dplyr) 
FECHA <- c("2015-01-08 15:03:00", "2015-01-08 15:18:00","2015-01-08 15:33:00","2015-01-08 15:48:00","2015-01-08 16:03:00","2015-01-08 16:18:00") 
Temp_Aqua <- c("23.472","22.609", "23.761","22.705", "22.298", "21.366") 
date_time <- matrix(unlist(str_split(FECHA, " ")), ncol = 2, byrow = T) 
x <- as.data.frame(cbind(date_time, Temp_Aqua), stringsAsFactors = F) 
names(x) <- c("date", "time", "temp_aqua") 
x$temp_aqua <- as.numeric(x$temp_aqua) 
x$hour <- str_extract(x$time, "^[0-9]{2}") 
x %>% group_by(date, hour) %>% summarise(hourly_temp_aqua = mean(temp_aqua)) 

Source: local data frame [2 x 3] 
Groups: date [?] 

     date hour hourly_temp_aqua 
     <chr> <chr>   <dbl> 
1 2015-01-08 15   23.13675 
2 2015-01-08 16   21.83200 

在您的解決方案,你應該有正確的存儲/格式化,並可能考慮簡單的平均值是否是正確的解決方案的時間戳(例如,如果intervalls分佈是不對稱的,你可以考慮給他們一個不同的權重)

希望這有助於!

0

這是我一直用於類似應用程序的功能。要注意的主要事情是使用trunc而不是round,並且您需要將datetime轉換爲POSIXct for dplyr,然後trunc返回POSIXlt。

library(lubridate) 
library(dplyr) 

hourly_ave <- function(timeseries_data){ 

    # Convert the "FECHA" column into datetime 
    timeseries_data$FECHA <- mdy_hm(timeseries_data$FECHA) 

    # Add an Hourly column (use trunc instead of round) 
    # Remember the "as.POSIXct() since trunc() returns POSIXlt which dplyr does not support 
    timeseries_data$Hourly = trunc(timeseries_data$FECHA, "hours") %>% as.POSIXct() 

    # Then group the data and summarize using dplyr 
    # I did not include all the variables, but you should get the idea 
    data_hr <- timeseries_data %>% 
       group_by(Hourly) %>% 
       summarize(Vel_RAFAGAS = mean(Vel_RAFAGAS), Temp_Am = mean(Temp_Am), HR = mean(HR), Temp_Ag = mean(Temp_Ag)) 

    data_hr 
}