2016-04-02 7 views
1

Я пытался работать над усреднением данных относительно месяца и времени. Данные, которые я использую, составляют 6 месяцев (скажем, с января по июнь) с интервалом 15 минут в одном столбце и значением в период времени во втором столбце. я усредняюсь данными от минутного интервала почасового интервала с использованием указанных ниже трески:Как агрегировать данные относительно уровня времени?

library(xts) 

data<-read.csv("C:/Users/naman.nagar/Downloads/JAVA &R/15_Minute_Site_ Avg.csv",header=TRUE,stringsAsFactors = FALSE) 
data$Timestamp<-as.POSIXct(strptime(cognos_data$Timestamp,format="%Y-%m-%d %H:%M")) 
data.xts<-xts(x=cognos_data$Wanamaker,cognos_data$Timestamp) 
ep<-endpoints(data.xts,"hours") 
period.apply(data.xts,ep,mean) 

Данные я заводится используя приведенный выше код:

2015-12-19 10:15:00 1602 
    2015-12-19 11:15:00 1608 
    2015-12-19 12:15:00 1590 
    2015-12-19 13:15:00 1590 
    2015-12-19 14:15:00 1344 
    2015-12-19 15:15:00 1338 
    2015-12-19 16:15:00 1338 
    2015-12-19 17:15:00 1338 
    2015-12-19 18:15:00 1338 
    2015-12-19 19:15:00 1392 
    2015-12-19 20:15:00 1368 
    2015-12-19 21:15:00 1302 
    2015-12-19 22:15:00 1302 
    2015-12-19 23:15:00 1266 
    2015-12-20 00:15:00 1248 
    2015-12-20 01:15:00 1254 
    2015-12-20 02:15:00 1218 
    2015-12-20 03:15:00 1188 

Теперь из этих данных, я хотят среднемесячные данные, как:

2015-12 10:00:00 1389 
    2015-12 11:00:00 1390 
    2015-12 12:00:00 1400 
    2015-12 13:00:00 1396 

средства, чтобы сказать, что я получить усредненные данные полного месяца декабря на почасовой уровне говорят на 12:00:00, чтобы получить усредненное значение по номиналу конкретный час для полного месяца.

Пожалуйста, помогите. Спасибо заранее!

ответ

1

вот решение с использованием dplyr и lubridate пакетов. скажем, у вас есть такие данные, как:

library(dplyr) 
library(lubridate) 

# just to make it reproducible 
# also added a line at 10:00:00 so that we have at least once more than one value for hour 10 

    data <- structure(list(timestamp = c("2015-12-19 10:00:00", "2015-12-19 10:15:00", 
"2015-12-19 11:15:00", "2015-12-19 12:15:00", "2015-12-19 13:15:00", 
"2015-12-19 14:15:00", "2015-12-19 15:15:00", "2015-12-19 16:15:00", 
"2015-12-19 17:15:00", "2015-12-19 18:15:00", "2015-12-19 19:15:00", 
"2015-12-19 20:15:00", "2015-12-19 21:15:00", "2015-12-19 22:15:00", 
"2015-12-19 23:15:00", "2015-12-20 00:15:00", "2015-12-20 01:15:00", 
"2015-12-20 02:15:00", "2015-12-20 03:15:00"), x = c(400, 1602, 
1608, 1590, 1590, 1344, 1338, 1338, 1338, 1338, 1392, 1368, 1302, 
1302, 1266, 1248, 1254, 1218, 1188)), .Names = c("timestamp", 
"x"), row.names = c(NA, 19L), class = "data.frame") 

# let's have a look to it 
head(data) 
#     timestamp x 
# 1 2015-12-19 10:00:00 400 
# 2 2015-12-19 10:15:00 1602 
# 3 2015-12-19 11:15:00 1608 
# 4 2015-12-19 12:15:00 1590 
# 5 2015-12-19 13:15:00 1590 
# 6 2015-12-19 14:15:00 1344 
# etc. 

затем мы используем трубу ниже: я) создать новые столбцы year_month (я полагаю, вы будете иметь больше, чем один) + часов, II) группы с помощью year_month и часы, III) суммировать среднее значение для каждой группы (т.е. в час с данным месяцем):

data %>% 
    mutate(year_month=paste(year(timestamp), month(timestamp), sep="-"), 
      hour=hour(timestamp)) %>% 
    group_by(year_month, hour) %>% summarize(mean_x=mean(x)) 

    # year_month hour mean_x 
# (chr) (int) (dbl) 
# 1  2015-12  0 1248 
# 2  2015-12  1 1254 
# 3  2015-12  2 1218 
# 4  2015-12  3 1188 
# 5  2015-12 10 1001 
# 6  2015-12 11 1608 

Обратите внимание на значение часа 10.

Является ли это то, что вы хотите?

+0

В какой-то степени, но у меня есть шесть месяцев данных, и я хочу ежемесячные данные усредняются на почасовой основе. Ваш ответ будет группировать и усреднять полный набор данных в течение 6 месяцев в течение определенного часа, однако мне нужно усреднять каждый ежемесячный отчет на ежечасном уровне. Поскольку данные составляют 6 месяцев, это приведет к 144 строкам (6 месяцев * 24 часа). Это имеет смысл? – NAN

+0

редактировал мой ответ, когда я понял, что ;-) –

+0

Большое спасибо Винсент! :-) – NAN

1

Мы могли бы сделать что-то подобное в data.table:

library(data.table) 
setDT(df)[, .(mean = mean(value)), by = .(year = format(Timestamp, "%Y"), 
              month = format(Timestamp, "%m"), 
              hour = format(Timestamp, "%H"))] 
# year month hour mean 
#1: 2015 12 10 1602 
#2: 2015 12 11 1608 
#3: 2015 12 12 1590 
#4: 2015 12 13 1590 
#5: 2015 12 14 1344 
#6: 2015 12 15 1338 
+0

Большое спасибо @mtoto. :) – NAN

Смежные вопросы