【问题标题】:How to aggregate minute-based data to weekly data如何将基于分钟的数据聚合为每周数据
【发布时间】:2016-09-01 01:52:53
【问题描述】:

我有这样的数据:

        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这样的功能,那如何获取每日、每周甚至每小时的数据呢?

【问题讨论】:

标签: r dataframe time-series


【解决方案1】:

如果您将 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

【讨论】:

    【解决方案2】:

    这是一个使用 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多