我正在使用okmesonet
套餐获取有关降雨量的数据。我尝试使用此软件包中的avgokmts
来计算每天的降雨量,但我得到的是非感性值。
获取Norman,OK的降雨数据(每天5分钟的累积降雨量,单位为mm)
library(okmesonet)
rainDat <- okmts(begintime="2016-06-21 00:00:00", endtime="2016-07-04 00:00:00",
station="NRMN", variables="RAIN", localtime=TRUE)
计算每天的最大降雨量
avgokmts(rainDat, by="day", metric="max")
返回这些值
STID STNM DAY MONTH YEAR RAIN Time Date
1 NRMN 121 21 06 2016 0.00 23:55:00 2016-06-22
2 NRMN 121 22 06 2016 0.25 23:55:00 2016-06-23
3 NRMN 121 23 06 2016 59.70 23:55:00 2016-06-24
4 NRMN 121 24 06 2016 0.00 23:55:00 2016-06-25
5 NRMN 121 25 06 2016 0.00 23:55:00 2016-06-26
6 NRMN 121 26 06 2016 0.00 23:55:00 2016-06-27
7 NRMN 121 27 06 2016 0.00 23:55:00 2016-06-28
8 NRMN 121 28 06 2016 0.00 23:55:00 2016-06-29
9 NRMN 121 29 06 2016 0.00 23:55:00 2016-06-30
10 NRMN 121 30 06 2016 28.19 23:55:00 2016-07-01
11 NRMN 121 01 07 2016 0.00 23:55:00 2016-07-02
12 NRMN 121 02 07 2016 0.51 23:55:00 2016-07-03
13 NRMN 121 03 07 2016 0.00 23:55:00 2016-07-04
14 NRMN 121 04 07 2016 0.00 00:00:00 2016-07-04
但是这些降雨量值非常明显地与降雨量不符,如下图所示(6月27日和7月3日降雨量最大)。
plot(rainDat$TIME, rainDat$RAIN, xlab="Date", ylab="Cumulative Daily Rain (mm)")
为什么avgokmts
在这种情况下不起作用?我如何调用该函数是否有错误?有没有其他方法可以使用此数据集计算每日降雨量?
答案 0 :(得分:0)
我很确定pkg作者没有正确处理降水读数的UTC&lt; - &gt; CDT转换。如果您使用单站,这是一种每天最大降水量的脆弱方式。扩展处理多个站的过程应该只增加一个group_by()
变量。
library(okmesonet)
library(dplyr)
library(ggplot2)
library(gridExtra)
rainDat <- okmts(begintime="2016-06-21 00:00:00",
endtime="2016-07-04 00:00:00",
station="NRMN",
variables="RAIN",
localtime=TRUE)
# Use the pkg calculation -------------------------------------------------
pkg_calc <- avgokmts(rainDat, by="day", metric="max")
# Begin our own calculations ----------------------------------------------
rainDat <- mutate(rainDat, day=format(TIME, "%Y-%m-%d"))
day_precip_max <- function(x) {
prev_day_last_reading_time <- as.POSIXct(sprintf("%s 23:55:00", x$day[1]), tz="America/Chicago") -
as.difftime(1, unit="days")
prev_day_last_reading <- rainDat[rainDat$TIME==prev_day_last_reading_time, "RAIN"]
if (length(prev_day_last_reading) == 0) prev_day_last_reading <- 0
x <- mutate(x, RAIN=RAIN - prev_day_last_reading)
data_frame(
STID=x$STID[1], STNM=x$STNM[1],
DAY=substr(x$day[1], 9, 10),
MONTH=substr(x$day[1], 6, 7),
YEAR=substr(x$day[1], 1, 4),
RAIN=max(x$RAIN)
)
}
new_calc <- group_by(rainDat, day) %>% do(day_precip_max(.)) %>% ungroup()
# Convert to POSIXct for common plotting axis ------------------------------
pkg_calc <- mutate(pkg_calc, day=as.POSIXct(sprintf("%s-%s-%s 23:55:00", YEAR, MONTH, DAY), tz="America/Chicago"))
new_calc <- mutate(new_calc, day=as.POSIXct(sprintf("%s-%s-%s 23:55:00", YEAR, MONTH, DAY), tz="America/Chicago"))
grid.arrange(
ggplot(rainDat, aes(x=TIME, y=RAIN)) +
geom_point() +
scale_x_datetime(date_breaks="1 day", date_labels="%d") +
labs(x=NULL, y="Rain", title="Raw readings")
,
ggplot(pkg_calc, aes(x=day, y=RAIN)) +
geom_point() +
scale_x_datetime(date_breaks="1 day", date_labels="%d", limits=range(rainDat$TIME)) +
labs(x=NULL, y="Rain", title="Package aggregation (max)")
,
ggplot(new_calc, aes(x=day, y=RAIN)) +
geom_point() +
scale_x_datetime(date_breaks="1 day", date_labels="%d", limits=range(rainDat$TIME)) +
labs(x=NULL, y="Rain", title="Manual aggregation (max)")
,
ncol=1
)
我的情节在23:55:00显示最大读数。