Агрегация почасовых данных в ежедневные агрегаты
У меня есть данные почасовой погоды в следующем формате:
Date,DBT
01/01/2000 01:00,30
01/01/2000 02:00,31
01/01/2000 03:00,33
...
...
12/31/2000 23:00,25
Мне нужна ежедневная совокупность max, min, ave, как это:
Date,MaxDBT,MinDBT,AveDBT
01/01/2000,36,23,28
01/02/2000,34,22,29
01/03/2000,32,25,30
...
...
12/31/2000,35,9,20
Как это сделать в R?
Ответы
Ответ 1
1) Это можно сделать компактно с помощью зоопарка:
L <- "Date,DBT
01/01/2000 01:00,30
01/01/2000 02:00,31
01/01/2000 03:00,33
12/31/2000 23:00,25"
library(zoo)
stat <- function(x) c(min = min(x), max = max(x), mean = mean(x))
z <- read.zoo(text = L, header = TRUE, sep = ",", format = "%m/%d/%Y", aggregate = stat)
Это дает:
> z
min max mean
2000-01-01 30 33 31.33333
2000-12-31 25 25 25.00000
2) вот решение, которое использует только ядро R:
DF <- read.csv(text = L)
DF$Date <- as.Date(DF$Date, "%m/%d/%Y")
ag <- aggregate(DBT ~ Date, DF, stat) # same stat as in zoo solution
Последняя строка дает:
> ag
Date DBT.min DBT.max DBT.mean
1 2000-01-01 30.00000 33.00000 31.33333
2 2000-12-31 25.00000 25.00000 25.00000
EDIT: (1) Так как этот первый появился, в пакете zoo был добавлен аргумент text=
для read.zoo
.
(2) незначительные улучшения.
Ответ 2
Используя strptime()
, trunc()
и ddply()
из пакета plyr:
#Make the data
ZZ <- textConnection("Date,DBT
01/01/2000 01:00,30
01/01/2000 02:00,31
01/01/2000 03:00,33
12/31/2000 23:00,25")
dataframe <- read.csv(ZZ,header=T)
close(ZZ)
# Do the calculations
dataframe$Date <- strptime(dataframe$Date,format="%m/%d/%Y %H:%M")
dataframe$day <- trunc(dataframe$Date,"day")
require(plyr)
ddply(dataframe,.(day),
summarize,
aveDBT=mean(DBT),
maxDBT=max(DBT),
minDBT=min(DBT)
)
дает
day aveDBT maxDBT minDBT
1 2000-01-01 31.33333 33 30
2 2000-12-31 25.00000 25 25
Чтобы уточнить:
strptime
преобразует символ в даты в соответствии с форматом. Чтобы узнать, как вы можете указать формат, см. ?strptime
. trunc
затем усечет эти даты-даты до указанного элемента, который в этот день является днем.
ddply
будет оценивать функцию summarize
в пределах кадра данных после разделения его на day
. все после summarize
являются аргументами, которые передаются функции summarize
.
Ответ 3
Существует также хороший пакет под названием HydroTSM. Он использует объекты зоопарка и может конвертировать в другие агрегаты во времени
Функция в вашем случае - каждый день. Вы можете выбрать, будет ли агрегация основана на min/max/mean...
Ответ 4
Для этого вы можете использовать пакет tidyquant
. Этот процесс включает использование функции tq_transmute
для возврата фрейма данных, который изменяется с помощью функции агрегации xts, apply.daily
. Мы применим пользовательский stat_fun
, который возвращает min, max и mean. Однако вы можете применить любую векторную функцию, которая вам нужна, например quantile
.
library(tidyquant)
df
#> # A tibble: 4 x 2
#> Date DBT
#> <dttm> <dbl>
#> 1 2000-01-01 01:00:00 30
#> 2 2000-01-01 02:00:00 31
#> 3 2000-01-01 03:00:00 33
#> 4 2000-12-31 23:00:00 25
stat_fun <- function(x) c(min = min(x), max = max(x), mean = mean(x))
df %>%
tq_transmute(select = DBT,
mutate_fun = apply.daily,
FUN = stat_fun)
# A tibble: 2 x 4
#> Date min max mean
#> <dttm> <dbl> <dbl> <dbl>
#> 1 2000-01-01 03:00:00 30 33 31.33333
#> 2 2000-12-31 23:00:00 25 25 25.00000