首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NA将5分钟的数据汇总成每小时的总和

用NA将5分钟的数据汇总成每小时的总和
EN

Stack Overflow用户
提问于 2015-11-20 13:28:55
回答 2查看 1.6K关注 0票数 2

我的问题如下:我有一个5分钟降水数据的时间序列,如:

代码语言:javascript
复制
            Datum mm
1 2004-04-08 00:05:00 NA
2 2004-04-08 00:10:00 NA
3 2004-04-08 00:15:00 NA
4 2004-04-08 00:20:00 NA
5 2004-04-08 00:25:00 NA
6 2004-04-08 00:30:00 NA

在这种结构下:

代码语言:javascript
复制
'data.frame':   1098144 obs. of  2 variables:
$ Datum: POSIXlt, format: "2004-04-08 00:05:00" "2004-04-08 00:10:00"   "2004-04-08 00:15:00" "2004-04-08 00:20:00" ...
$ mm   : num  NA NA NA NA NA NA NA NA NA NA ...

正如你所看到的,时间序列是从大量的NA's开始的,但是有测量到的更低的降水,尽管由于测量站的故障而充满了单一的,不太常见的NA's

我想要实现的是,把实测的降水量加到每小时的总和,而不考虑NA's

这就是我迄今为止尝试过的:

代码语言:javascript
复制
sums <- aggregate(precip["mm"], 
               list(cut(precip$Datum, "1 hour")), sum)

即使时间戳被正确地聚合为小时,所有的总和都是0NA。如果根本没有NA,甚至都不计算和。

此外,还应考虑到:

气象学中的每小时降水量之和总是描述某一小时的累积和: 0:00的降水量表示从前一天23:00到0:00的总和。所以我总是需要总结一下前一个小时。

可复制示例

代码语言:javascript
复制
set.seed(1120)
s <- as.POSIXlt("2004-03-08 23:00:00")
r <- seq(s, s+1e4, "30 min")
precip <- data.frame(Datum=r, mm=sample(c(1:5,NA), 6, T))

            Datum mm
2004-03-08 23:00:00  4
2004-03-08 23:30:00  1
2004-03-09 00:00:00  2
2004-03-09 00:30:00  4
2004-03-09 01:00:00  1
2004-03-09 01:30:00  4

在上面的例子中,我要寻找的结果是:

代码语言:javascript
复制
            Datum mm
2004-03-09 00:00:00 5
2004-03-09 01:00:00 6
2004-03-09 02:00:00 5
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-20 13:35:08

尝试添加na.rm=TRUE

代码语言:javascript
复制
aggregate(precip['mm'], list(cut(precip$Datum, "1 hour")), sum, na.rm=TRUE)
#               Group.1 mm
# 1 2004-04-08 00:00:00 26
# 2 2004-04-08 01:00:00 35
# 3 2004-04-08 02:00:00 25

可复制示例

代码语言:javascript
复制
set.seed(1120)
s <- as.POSIXlt("2004-04-08 00:05:00")
r <- seq(s, s+1e4, "5 min")
precip <- data.frame(Datum=r, mm=sample(c(1:5,NA), 34, T))

增编

关于你的第二个问题:如果你想用较小的小时来计算小时的测量值,那么添加right=TRUE

代码语言:javascript
复制
aggregate(precip['mm'], list(cut(precip$Datum, "1 hour", right=TRUE)), sum, na.rm=TRUE)

进一步解释

我们将创建另一个更详细的解释,以说明解决方案是如何工作的:

代码语言:javascript
复制
p <- c("2004-04-07 23:48:20", "2004-04-08 00:00:00", "2004-04-08 00:03:20")
ptime <- as.POSIXlt(p)
#[1] "2004-04-07 23:48:20 EDT" "2004-04-08 00:00:00 EDT" "2004-04-08 00:03:20 EDT"

我们有三次约会要分成几组。如果我们使用cut而没有任何额外的参数,那么第二个条目"2004-04-08 00:00:00 EDT"将与第三个条目"00:00"一起分组。

代码语言:javascript
复制
cut(ptime, "1 hour")
#[1] 2004-04-07 23:00:00 2004-04-08 00:00:00 2004-04-08 00:00:00

但是,如果我们添加参数right=FALSE,我们可以将其与"23:00"小时进行分组:

代码语言:javascript
复制
cut(ptime, "1 hour", right=TRUE)
#[1] 2004-04-07 23:00:00 2004-04-07 23:00:00 2004-04-08 00:00:00

我们可以指定边缘情况的行为。

编辑

使用新数据,原始解决方案将产生所需的输出:

代码语言:javascript
复制
aggregate(precip['mm'], list(cut(precip$Datum, "1 hour")), sum, na.rm=TRUE)
              Group.1 mm
1 2004-03-08 23:00:00  5
2 2004-03-09 00:00:00  6
3 2004-03-09 01:00:00  5
票数 3
EN

Stack Overflow用户

发布于 2015-11-20 14:00:53

可以使用dplyr计算和,如下所示:

代码语言:javascript
复制
precip$hour <-  strftime(precip$Datum,"%Y-%m-%d %H")
library(dplyr)
sum_hour <- precip %>% group_by(hour) %>% summarise(sum_hour = sum(mm,na.rm = T))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33827949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档