如何将基于分钟的数据聚合到每周数据

时间:2016-09-01 01:52:53

标签: r dataframe time-series

我有这样的数据:

        Date     Time Global_active_power
1 16/12/2006 17:24:00               4.216
2 16/12/2006 17:25:00               5.360
3 16/12/2006 17:26:00               5.374
4 16/12/2006 17:27:00               5.388
5 16/12/2006 17:28:00               3.666
6 16/12/2006 17:29:00               3.520

由于我需要进行时间序列分析,我可能需要将这些基于分钟的数据汇总到基于每日,每周,每月或基于季度的数据。但是,我尝试使用以下代码来获取基于月度和季度的数据(基于函数as.yearmonas.yearqtr):

agg_Month <-aggregate(tmp_hPower,by=list(as.yearmon(tmp_hPower$Date,'%d/%m/%Y')), 
FUN = mean, na.rm = TRUE )

似乎没有as.yearweek之类的功能,那么如何获取基于每日的每日数据,甚至是基于小时的数据呢?

2 个答案:

答案 0 :(得分:2)

如果将data.frame转换为xts对象,这非常简单。

# original data
tmp_hPower <- read.table(text="        Date     Time Global_active_power
1 16/12/2006 17:24:00               4.216
2 16/12/2006 17:25:00               5.360
3 16/12/2006 17:26:00               5.374
4 16/12/2006 17:27:00               5.388
5 16/12/2006 17:28:00               3.666
6 16/12/2006 17:29:00               3.520")
# xts object from original data
library(xts)
x <- with(tmp_hPower, xts(Global_active_power,
  as.POSIXct(paste(Date,Time), format="%d/%m/%Y %H:%M:%S")))
# use period.apply and endpoints to aggregate to any frequency
period.apply(x, endpoints(x, "hours"), mean)  # hourly
period.apply(x, endpoints(x, "days"), mean)   # daily
period.apply(x, endpoints(x, "weeks"), mean)  # weekly

答案 1 :(得分:0)

以下是使用dplyr包的选项:

library(dplyr)
library(lubridate)
library(zoo)

# Fake data
set.seed(4999)
dat = data.frame(time=seq(as.POSIXct("2015-01-01"),
                          as.POSIXct("2016-12-31"), length.out=1000),
                 value=rnorm(1000))

您可以添加允许按周,月等汇总的时间组

dat = dat %>% 
  mutate(year_day = paste0(year(time),'-', yday(time)),
         year_week = paste0(year(time),"-",strftime(time,"%W")),
         year_mon = as.yearmon(time),
         year_qtr = as.yearqtr(time)) 

现在,按周总结一下。您可以按照类似的方式按日,月等进行汇总。

dat.by.week = dat %>%
  group_by(year_week) %>%
  summarise(value=mean(value))

此外,您实际上不必将时间组添加到原始数据中。你可以随时做全部事情。例如:

dat.by.week = dat %>% 
  mutate(year_week = paste0(year(time),"-",strftime(time,"%W"))) %>%
  group_by(year_week) %>%
  summarise(value=mean(value))