#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 в функции и немного изменяете округление.