R avgokmts从ok中网数据返回不正确的最大降雨量

R avgokmts从ok中网数据返回不正确的最大降雨量,r,dataframe,R,Dataframe,我正在使用okmesonet软件包获取降雨数据。我曾尝试使用此软件包中的avgokmts来计算每天的降雨量,但我得到的是非感官值 获取诺曼的降雨数据,OK(以毫米为单位的一天累积降雨量,间隔5分钟) 返回这些值 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

我正在使用
okmesonet
软件包获取降雨数据。我曾尝试使用此软件包中的
avgokmts
来计算每天的降雨量,但我得到的是非感官值

获取诺曼的降雨数据,OK(以毫米为单位的一天累积降雨量,间隔5分钟)

返回这些值

   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日)


为什么在这种情况下,
avgokmts
不起作用?我调用函数的方式是否有错误?是否有其他方法可以使用此数据集计算每日降雨量?

我很确定pkg作者没有正确处理precip读数的UTCCDT转换。如果您使用的是单站,这里有一个脆弱的方法来获得每天的最大精度。扩展过程以处理多个工作站,只需再添加一个
group\u 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
)
库(okmesonet)
图书馆(dplyr)
图书馆(GG2)
图书馆(gridExtra)

rainDat我很确定pkg作者没有正确处理precip读数的UTCCDT转换。如果您使用的是单站,这里有一个脆弱的方法来获得每天的最大精度。扩展过程以处理多个工作站,只需再添加一个
group\u 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
)
库(okmesonet)
图书馆(dplyr)
图书馆(GG2)
图书馆(gridExtra)
雷恩达特
plot(rainDat$TIME, rainDat$RAIN, xlab="Date", ylab="Cumulative Daily Rain (mm)")
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
)