Агрегирование почасовых данных в ежедневные агрегаты - PullRequest
13 голосов
/ 05 марта 2011

У меня есть почасовые данные о погоде в следующем формате:

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?

Ответы [ 4 ]

19 голосов
/ 05 марта 2011

1) Это можно сделать компактно, используя zoo:

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

РЕДАКТИРОВАТЬ: (1) С тех пор как это впервые появилось аргумент text= для read.zoo был добавлен в пакет зоопарка.(2) незначительные улучшения.

5 голосов
/ 05 марта 2011

Использование 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.

2 голосов
/ 15 апреля 2014

Существует также хороший пакет под названием HydroTSM.Он использует объекты зоопарка и может конвертировать в другие агрегаты во времени

Функция в вашем случае subdaily2dailyВы можете выбрать, должна ли агрегация основываться на минимуме / максимуме / среднем ...

0 голосов
/ 27 июня 2017

Для этого вы можете использовать пакет tidyquant.Процесс заключается в использовании функции tq_transmute для возврата кадра данных, который был изменен с использованием функции агрегирования xts apply.daily.Мы применим пользовательский stat_fun, который возвращает минимальное, максимальное и среднее значение.Однако вы можете применить любую векторную функцию, например, 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
...