使用 NA 将 5 分钟数据汇总为每小时总和
Aggregate 5 minute data to hourly sums with NA's
我的问题如下:我有一个包含 5 分钟降水数据的时间序列,例如:
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
采用这种结构:
'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
。
这是我到目前为止尝试过的:
sums <- aggregate(precip["mm"],
list(cut(precip$Datum, "1 hour")), sum)
即使时间戳正确聚合到小时,所有总和也是 0
或 NA
。如果根本没有 NA
,则甚至不会计算总和。
另外要考虑:
气象学中的每小时降水量总和描述到某个时间的累计总和:0:00点的降水量描述从[=48]开始的总和=] 前一天 直到 0:00。所以我总是需要总结前一个小时
可重现的例子
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
以上面的例子,我要找的结果是:
Datum mm
2004-03-09 00:00:00 5
2004-03-09 01:00:00 6
2004-03-09 02:00:00 5
尝试添加 na.rm=TRUE
:
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
可重现的例子
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
:
aggregate(precip['mm'], list(cut(precip$Datum, "1 hour", right=TRUE)), sum, na.rm=TRUE)
进一步说明
我们将创建另一个更详细的解释来展示解决方案的工作原理:
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"
:
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"
小时分组:
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
我们可以指定边缘情况的行为。
编辑
使用您的新数据,原始解决方案会产生所需的输出:
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
您可以使用 dplyr 来计算和:
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))
我的问题如下:我有一个包含 5 分钟降水数据的时间序列,例如:
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
采用这种结构:
'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
。
这是我到目前为止尝试过的:
sums <- aggregate(precip["mm"],
list(cut(precip$Datum, "1 hour")), sum)
即使时间戳正确聚合到小时,所有总和也是 0
或 NA
。如果根本没有 NA
,则甚至不会计算总和。
另外要考虑:
气象学中的每小时降水量总和描述到某个时间的累计总和:0:00点的降水量描述从[=48]开始的总和=] 前一天 直到 0:00。所以我总是需要总结前一个小时
可重现的例子
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
以上面的例子,我要找的结果是:
Datum mm
2004-03-09 00:00:00 5
2004-03-09 01:00:00 6
2004-03-09 02:00:00 5
尝试添加 na.rm=TRUE
:
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
可重现的例子
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
:
aggregate(precip['mm'], list(cut(precip$Datum, "1 hour", right=TRUE)), sum, na.rm=TRUE)
进一步说明
我们将创建另一个更详细的解释来展示解决方案的工作原理:
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"
:
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"
小时分组:
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
我们可以指定边缘情况的行为。
编辑
使用您的新数据,原始解决方案会产生所需的输出:
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
您可以使用 dplyr 来计算和:
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))