我有这样的数据:
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.yearmon
和as.yearqtr
):
agg_Month <-aggregate(tmp_hPower,by=list(as.yearmon(tmp_hPower$Date,'%d/%m/%Y')),
FUN = mean, na.rm = TRUE )
似乎没有as.yearweek
之类的功能,那么如何获取基于每日的每日数据,甚至是基于小时的数据呢?
答案 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))