我一直在网上搜索,但没有找到解决这个非常简单的问题的方法。
这是使用库'xts',
的半小时数据library(xts)
data.xts <- as.xts(1:nrow(data), as.POSIXct("2007-08-24 17:30:00") +
1800 * (1:nrow(data)))
data.xts <-as.data.frame(data.xts)
我将其更改为data.frame,因为原始数据是data.frame格式。实际上,在原始数据框中,有一个time_stamp列,如果我可以只使用time_stamp列而不是使用'xts'格式,我更喜欢。
我如何平均每月的每小时数据,以便我可以绘制不同月份的24小时的每小时时间序列?
例如,
2007-08-24 17:30:00 1
2007-08-25 17:00:00 47
2007-08-25 17:30:00 48
2007-08-26 17:00:00 95
将平均为2007年8月等等。
目标是绘制每月平均24小时的时间序列。
谢谢!
答案 0 :(得分:1)
尝试
library(dplyr)
res <- dat %>%
group_by(month=format(datetime, '%m'),
#year=format(datetime, '%Y'), #if you need year also
# as grouping variable
hour=format(as.POSIXct(cut(datetime, breaks='hour')), '%H')) %>%
summarise(Meanval=mean(val, na.rm=TRUE))
head(res,3)
# month hour Meanval
#1 01 00 -0.02780036
#2 01 01 -0.06589948
#3 01 02 -0.02166218
如果您的datetime
为POSIXlt
,则可以将其转换为POSIXct
。
dat$datetime <- as.POSIXlt(dat$datetime)
通过运行上面的代码,我收到了错误
# Error: column 'datetime' has unsupported type
您可以使用mutate
并将datetime
转换为POSIXct
类as.POSIXct
res1 <- dat %>%
mutate(datetime= as.POSIXct(datetime)) %>%
group_by(month=format(datetime, '%m'),
#year=format(datetime, '%Y'), #if you need year also
# as grouping variable
hour=format(as.POSIXct(cut(datetime, breaks='hour')), '%H')) %>%
summarise(Meanval=mean(val, na.rm=TRUE))
set.seed(24)
dat <- data.frame(datetime=seq(Sys.time(), by='1 hour', length.out=2000),
val=rnorm(2000))
答案 1 :(得分:1)
如果我理解正确,您希望平均给定小时的所有值,对于给定月份中的所有日期,并对所有月份执行此操作。因此,对于给定月份的所有日期等,在午夜和00:59:59之间平均所有值。
我发现您要避免xts
,但aggregate.zoo(...)
就是为此设计的,并且避免使用dplyr
和cut
。
library(xts)
# creates sample dataset...
set.seed(1)
data <- rnorm(1000)
data.xts <- as.xts(data, as.POSIXct("2007-08-24 17:30:00") +
1800 * (1:length(data)))
# using aggregate.zoo(...)
as.hourly <- function(x) format(x,"%Y-%m %H")
result <- aggregate(data.xts,by=as.hourly,mean)
result <- data.frame(result)
head(result)
# result
# 2007-08 00 0.12236024
# 2007-08 01 0.41593567
# 2007-08 02 0.22670817
# 2007-08 03 0.23402842
# 2007-08 04 0.22175078
# 2007-08 05 0.05081899