R中将15分钟数据更改为每日平均值

时间:2014-10-03 13:14:14

标签: r

我有15分钟的数据,我想改变成日常均值。我刚刚列出了下面的哥伦比亚数据,但还有其他网站(CR1和CR2),我没有列出这些数据。我把我的代码放在底部。

我收到错误
x <- xts(d[,-1], as.POSIXct(d[,1], format="%Y-%m-%d %H:%M", tz = "EST"))
Error in as.POSIXct.default(d[, 1], format = "%Y-%m-%d %H:%M", tz = "EST") : 
  do not know how to convert 'd[, 1]' to class “POSIXct”"  

我对R很陌生,所以我很抱歉,如果答案非常简单,我应该抓住它。

 datetime         Discharge Columbia
 2014-01-19 22:00   6030    4.3
 2014-01-19 22:15   5970    4.28
 2014-01-19 22:30   5880    4.25
 2014-01-19 22:45   5830    4.23
 2014-01-19 23:00   5710    4.19
 2014-01-19 23:15   5620    4.16
 2014-01-19 23:30   5510    4.12
 2014-01-19 23:45   5400    4.08
 2014-01-20 00:00   5340    4.06
 2014-01-20 00:15   5290    4.04
 2014-01-20 00:30   5260    4.03
 2014-01-20 00:45   5210    4.01
 2014-01-20 01:00   5180    4
 2014-01-20 01:15   4990    3.93
 2014-01-20 01:30   4830    3.87
 2014-01-20 01:45   4810    3.86
 2014-01-20 02:00   4780    3.85
 2014-01-20 02:15   4780    3.85
 2014-01-20 02:30   4760    3.84
 2014-01-20 02:45   4760    3.84
 2014-01-20 03:00   4760    3.84
 2014-01-20 03:15   4760    3.84

USGS_Columbia_Data <- read.csv("~/Desktop/R/USGS_Columbia_Data.csv",header=TRUE)
## daily averages of the data
library(xts)
d <- structure(list(datetime = (USGS_Columbia_Data[1]), 
                Columbia = (USGS_Columbia_Data[3]), 
                CR1 = (USGS_Columbia_Data[5]), 
                CR2 = (USGS_Columbia_Data[7])), 
           .Names = c("datetime", "Columbia", "CR1", "CR2"), 
           row.names = c(NA, -3L), class = "data.frame")
x <- xts(d[,-1], as.POSIXct(d[,1], format="%Y-%m-%d %H:%M", tz = "EST"))
apply.daily(x, colMeans)

2 个答案:

答案 0 :(得分:2)

显然,另一个答案有效,但你可以(并且可能应该)使用xts来做这样的事情。问题在于您使用structure(...)来创建数据框。 USGS_Columbia_Data已经是一个数据框架。如果要提取列1,3,5和7,请执行以下操作:

d <- USGS_Columbia_Data[,c(1,3,5,7)]
colnames(d) <- c("datetime","Columbia","CR1","CR2"")

如果USGS_Columbia_Data已经包含这些列名,则可能不需要第二行。完成后,您可以按如下方式创建日期索引xts对象:

x <- xts(d[,-1], as.Date(d[,1], format="%Y-%m-%d"))

然后,以下任何一种方法都有效:(注意我在这里使用了你的例子中的d)。

apply.daily(x,mean)
#            Discharge Columbia
# 2014-01-19   5743.75 4.201250
# 2014-01-20   4965.00 3.918571

aggregate(x,as.Date,mean)
#            Discharge Columbia
# 2014-01-19   5743.75 4.201250
# 2014-01-20   4965.00 3.918571

会奏效。

如果您想将索引保留为POSIXct,请使用:

x <- xts(d[,-1], as.POSIXct(d[,1], format="%Y-%m-%d %H:%M"))
apply.daily(x,mean)
#                     Discharge Columbia
# 2014-01-19 23:45:00   5743.75 4.201250
# 2014-01-20 03:15:00   4965.00 3.918571

但请注意,索引是每个日期的最后一次,而不是日期本身。

答案 1 :(得分:1)

您可以使用cutaggregate

# make certain datetime is class POSIXct
d$datetime <- as.POSIXct(d$datetime, tz='EST')

aggregate(list(Discharge = d$Discharge, Columbia = d$Columbia), list(time = cut(d$datetime, "1 day")), mean)

> aggregate(list(Discharge = d$Discharge, Columbia = d$Columbia), list(datetime = cut(t$datetime, "1 day")), mean)
        time Discharge Columbia
1 2014-01-19   5743.75 4.201250
2 2014-01-20   4965.00 3.918571