根据R中的最低温度计算多个站点的寒流事件



如果气象站的最低温度连续3天或更长时间低于正常温度3°C或更高,则定义为寒潮。我已经尝试使用以下代码计算多个站点

#Calculation for multistation
set.seed(123)
df <- data.frame("date"= seq(from = as.Date("1970-1-1"), to = as.Date("2000-12-31"), by = "day"),
"Station1" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 10, 30),
"Station2" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 11, 29),
"Station3" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 9, 28))
head(df)
df$day <- format(df$date, format='%m-%d')
#Daily average (daily normal) calculation
df_summarise_all <- df %>% 
as_tibble() %>% # for easier viewing 
mutate(day = format(df$date, format='%m-%d')) %>% 
group_by(day) %>%
summarise_all(funs(mean)) %>% 
pivot_longer(cols = -c(date, day), names_to = "variable", values_to = "value") 
#Coldwave event calculation
df %>%
as_tibble() %>% # for easier viewing 
pivot_longer(cols = -c(date, day), names_to = "Stations", values_to = "MinT") %>% 
left_join(df_summarise_all %>% rename(mean_MinT = value), by = 'day') %>% 
mutate(is_coldwave = zoo::rollapplyr(MinT < (mean_MinT - 3), 
3, all,fill = NA))

从输出中可以看出,日正常温度和站点最低温度的结合是不正确的。我有三个问题

  1. 如何更正联接
  2. 如何获得每个车站每年的冷柜数量?以及
  3. 如何获得每个站点的总体冷波计数

您也应该通过Stations加入,并可能与mean_MinT - 3进行coldwave比较。

library(dplyr)
df_out <- df %>%
tidyr::pivot_longer(cols = -c(date, day), 
names_to = "Stations", values_to = "MinT") %>%
left_join(df_summarise_all %>% rename(mean_MinT = value), 
by = c('day' = 'day', 'Stations' = 'variable')) %>%
mutate(is_coldwave = zoo::rollapplyr(MinT < (mean_MinT - 3), 3, 
all,fill = NA))

要计算每年和总冷量,您可以使用与此答案中相同的方法。

df_year <- df_out %>%
group_by(Stations, year = format(date.x, "%Y")) %>%
summarise(total_cold = with(rle(is_coldwave), 
sum(values, na.rm = TRUE)))

并且CCD_ 3将给出总计数。

最新更新