Получите переменное среднее значение за определенный период времени

#r #dataframe #datetime #time #period

Вопрос:

Я заблокирован в своем анализе

У меня есть такой набор данных, как этот:

Дата Свет
2019-02-15 01:00:00 0.134
2019-02-15 02:00:00 0.345
2019-02-15 03:00:00 0.567
2019-02-15 04:00:00 0
2019-02-15 05:00:00 0.100
2019-03-10 15:00:00 0.890

Это большой набор данных с большим количеством дат. И я пытаюсь получить средние значения освещенности за разные периоды времени: среднее за день; среднее за 5 дней; среднее за 1 неделю (последние 4 дня сегодня ; последние 6 дней сегодня и среднее за день).

результаты, которые я хотел бы получить, похожи на этот набор данных :

Дата Свет timeperiod_5дней timeperiod_1 неделя timeperiod_24ч

Я попытался использовать другую функцию : экономия времени; xts. но я не могу получить никаких результатов, я не знаю, подходят ли они для того, чего я хочу.

Кто — нибудь знает, как я могу получить свои результаты ?

заранее спасибо!

Комментарии:

1. Привет, я хочу этого ежедневно

Ответ №1:

Я не уверен, что понимаю, какого результата вы ожидаете. Есть ли у вас часть или весь ваш код, которым вы можете поделиться ?

У меня есть кое-что, что может быть началом.

 data = read.csv(file = "data",header = T,sep = ",") data$Date = as.POSIXct(data$Date , format = "%Y-%m-%d %H:%M:%S" ) #to make date as date in R  data$Day = format(data$Date,"%Y-%m-%d") #to extract only the day  # Aggregation tab_A = aggregate(x=data[,-c(1,2,3)], by=list(A=data$Day), FUN=mean , na.rm = T) # Whith that you can get the daily mean of your data base  

Если вы найдете способ описать «неделю» в R, например, по номеру недели, вы можете агрегировать по неделям за каждый год.

Что касается последних 4 дней сегодня вы могли бы пойти просто, как :

 mean(data$Light[(length(data$Light)-5):length(data$Light)])  

Ответ №2:

Не уверен, что «24 часа» означает «сегодня» или «последние 24 часа», в первом случае ваш окончательный код будет выглядеть примерно так:

 library(dplyr) library(lubridate)  rollmean <- function(i,window){  startdate <- as.Date(df$Date[i])-days(window-1)  enddate <- as.Date(df$Date[i]) 1    tmp <- df %>% filter(between(as.Date(Date), startdate, enddate))  return(mean(tmp$Light)) }  for (i in 1:nrow(df)) {  df[i, "timeperiod_24h"] <- rollmean(i, 1)  df[i, "timeperiod_5d"] <- rollmean(i, 5)  df[i, "timeperiod_7d"] <- rollmean(i, 7) }  

Что приводит к:

 Date Light timeperiod_24h timeperiod_5d timeperiod_7d 1 2019-02-15 01:00:00 0.134 0.2292 0.2292 0.2292 2 2019-02-15 02:00:00 0.345 0.2292 0.2292 0.2292 3 2019-02-15 03:00:00 0.567 0.2292 0.2292 0.2292 4 2019-02-15 04:00:00 0.000 0.2292 0.2292 0.2292 5 2019-02-15 05:00:00 0.100 0.2292 0.2292 0.2292 6 2019-02-17 05:00:00 0.300 0.3000 0.2410 0.2410 7 2019-03-10 15:00:00 0.890 0.8900 0.8900 0.8900  

Если вместо этого вы хотите «последние 24 часа», вы опускаете as.Date букву s в функции и немного изменяете округление.