悬赏R语言连阴雨天数的计算

求各位搞一段R语言的代码,能够将天气数据按照下面的判断标准分段输出

img

# 读入天气数据,假设数据保存在名为weather的数据框中
# 数据框中应至少包含日期(Date)、测站编号(Station)、日降水量(Precipitation)、日照时数(Sunshine)等列
weather <- read.csv("weather_data.csv")

# 按测站和日期排序
weather <- weather[order(weather$Station, weather$Date), ]

# 定义函数,判断是否符合连阴雨条件
is_continuous_rainy <- function(precip, sunshine, min_days, max_nonrainy_days) {
  n <- length(precip)
  if (n < min_days) {
    return(FALSE)
  }
  rainy_days <- precip > 0
  nonrainy_days <- !rainy_days
  num_nonrainy_days <- sum(nonrainy_days)
  if (num_nonrainy_days > max_nonrainy_days) {
    return(FALSE)
  }
  rainy_periods <- rle(rainy_days)
  max_rainy_period <- max(rainy_periods$lengths[rainy_periods$values])
  if (max_rainy_period < min_days) {
    return(FALSE)
  }
  sunny_days <- sunshine >= 2
  num_sunny_days <- sum(sunny_days)
  if (num_sunny_days < min_days) {
    return(FALSE)
  }
  if (max_rainy_period >= 7) {
    # 连续7天及以上降水日
    nonrainy_gaps <- diff(nonrainy_days)
    nonrainy_gaps <- nonrainy_gaps[sunny_days[-n]]
    if (any(nonrainy_gaps >= 26)) {
      return(FALSE)
    }
    return(TRUE)
  } else {
    # 连续4天及以上降水日
    return(sunshine[1] < 2 && max_rainy_period + num_nonrainy_days >= min_days)
  }
}

# 按照测站和日期分组,判断每个日期段是否符合连阴雨条件
grouped <- group_by(weather, Station)
result <- summarise(grouped, 
                    start_date = first(Date),
                    end_date = last(Date),
                    is_continuous_rainy = is_continuous_rainy(Precipitation, Sunshine, 4, 1) | 
                                         is_continuous_rainy(Precipitation, Sunshine, 7, 2))

# 输出结果,只保留符合条件的日期段
result <- result[result$is_continuous_rainy, ]
write.csv(result, "continuous_rainy_periods.csv", row.names = FALSE)

引用new bing部分回答作答:
以下是一个处理气象数据的示例R代码,按照所述标准将日期段分段输出:

# 假设数据文件名为weather.csv,包含日期、日照时数、是否降水等字段
weather <- read.csv("weather.csv", stringsAsFactors = FALSE)

# 将日期转换为日期格式
weather$date <- as.Date(weather$date)

# 根据测站和日期排序
weather <- weather[order(weather$station, weather$date), ]

# 新建一个变量 rain,表示该日期是否降水
weather$rain <- ifelse(weather$rainfall > 0, 1, 0)

# 新建一个变量 period,表示当前日期属于哪个连阴雨周期
weather$period <- NA

# 初始化连阴雨周期计数器
rain_days <- 0
sun_hours <- 0
non_rain_days <- 0
last_rain_date <- NA
last_non_rain_date <- NA

# 遍历数据
for (i in 1:nrow(weather)) {
  # 获取当前测站和日期
  station <- weather[i, "station"]
  date <- weather[i, "date"]
  
  # 如果是新的测站或日期不连续,则重置连阴雨周期计数器
  if (station != last_station || date != last_date + 1) {
    rain_days <- 0
    sun_hours <- 0
    non_rain_days <- 0
    last_rain_date <- NA
    last_non_rain_date <- NA
  }
  
  # 更新上一次遍历的测站和日期
  last_station <- station
  last_date <- date
  
  # 如果是降水日
  if (weather[i, "rain"] == 1) {
    # 如果上一次降水日期不是连续的前一天,则重置连阴雨周期计数器
    if (last_rain_date != last_date - 1) {
      rain_days <- 1
      sun_hours <- 0
      non_rain_days <- 0
    } else {
      rain_days <- rain_days + 1
    }
    last_rain_date <- date
    last_non_rain_date <- NA
  } else {
    # 如果上一次非降水日期不是连续的前一天,则重置连阴雨周期计数器
    if (last_non_rain_date != last_date - 1) {
      rain_days <- 0
      sun_hours <- 0
      non_rain_days <- 1
      last_rain_date <- NA
    } else {
      non_rain_days <- non_rain_days + 1
    }
    last_non_rain_date <- date
    last_rain_date <- NA
    # 如果非降水日的日照时数小于2,则增加日照不足计数器
    if (weather[i, "sunshine"] < 2) {
      sun_hours <- sun_hours + 1
    }
  }
  
  # 根据连阴雨条件,更新周期标记
  if (rain_days >= 4 && non_rain_days <= 1 && sun_hours <= 1) {
    weather[i - rain_days + 1:i, "period"] <- "LZY"
  } else if (rain_days >= 7 && non_rain_days <= 2) {
# 如果连续降水天数达到7天及以上,至多有2天非降水日,且这2天非降水日不相邻,则标记为连阴雨
non_rain_indices <- which(weather[(i - non_rain_days + 1):i, "rain"] == 0)
if (length(non_rain_indices) == 2 && diff(non_rain_indices) > 1 && all(weather[(i - non_rain_days + 1):i, "sunshine"] < 2)) {
weather[i - rain_days + 1:i, "period"] <- "LZY"
}
} else {
# 如果不满足连阴雨条件,则将周期标记设为NA
weather[i, "period"] <- NA
}
}

#输出结果
print(weather[, c("station", "date", "rainfall", "sunshine", "period")])


以下答案由GPT-3.5大模型与博主波罗歌共同编写:
以下是使用R语言计算连阴雨天数的示例代码:

# 导入数据
data <- read.csv("weather.csv")

# 处理日期格式
data$date <- as.Date(data$date, "%Y-%m-%d")

# 计算连阴天数,并将结果添加到新的一列
data$rainy_days in a row <- 0
count <- 0
for (i in 1:nrow(data)) {
  if (data$rain[i] > 0) {
    count <- count + 1
    data$rainy_days in a row[i] <- count
  } else {
    count <- 0
    data$rainy_days in a row[i] <- count
  }
}

# 将连阴天数按照判断标准分段输出
for (i in 1:nrow(data)) {
  if (data$rainy_days in a row[i] >= 7) {
    print(paste("第", i, "天:暴雨连绵", data$rainy_days in a row[i], "天"))
  } else if (data$rainy_days in a row[i] >= 5) {
    print(paste("第", i, "天:大雨连续", data$rainy_days in a row[i], "天"))
  } else if (data$rainy_days in a row[i] >= 3) {
    print(paste("第", i, "天:小雨连续", data$rainy_days in a row[i], "天"))
  } else {
    print(paste("第", i, "天:晴朗"))
  }
}

代码说明:

  1. 首先导入天气数据,可以使用 read.csv 函数读取 csv 文件,存储为一个数据框。

  2. 处理日期格式,将日期转换为 Date 类型,以便后续计算。

  3. 使用循环遍历每一天的数据,计算连阴雨天数,并将其添加到数据框中。

  4. 再次使用循环遍历每一天的数据,按照判断标准分段输出。如果连阴天数超过7天,输出“暴雨连绵x天”,如果大于等于5天,输出“大雨连续x天”,如果大于等于3天,输出“小雨连续x天”,否则输出“晴朗”。

注意事项:

  1. 以上示例代码仅作为参考,实际应用中需要根据具体数据情况进行调整。

  2. 如需输出结果到文件,可使用 write.tablewrite.csv 函数进行输出。
    如果我的回答解决了您的问题,请采纳!

以下内容引用CHATGPT:

可以使用R语言中的循环和条件语句来实现这个问题。具体思路如下:

  1. 读入天气数据并将日期列转换为日期格式。
  2. 循环遍历每一天的天气数据,对于每一天:
    • 判断是否为雨天,如果是则将连续雨天数加1;
    • 如果不是雨天,则将当前的连续雨天数和上一个雨天日期保存到结果列表中,并将当前的连续雨天数清零。
  3. 将结果列表转换为数据框并输出。

代码如下:

# 读入天气数据
weather <- read.csv("weather.csv", stringsAsFactors = FALSE)
weather$date <- as.Date(weather$date)

# 初始化变量
rainy_days <- which(weather$rain == 1)
result <- list()
count <- 0
last_rainy_day <- 0

# 循环遍历每一天的天气数据
for (i in 1:nrow(weather)) {
  if (i %in% rainy_days) {
    # 如果是雨天,则将连续雨天数加1
    count <- count + 1
    last_rainy_day <- i
  } else if (count > 0) {
    # 如果不是雨天,且有连续雨天,则将结果保存到列表中
    result[[length(result) + 1]] <- c(last_rainy_day, count)
    count <- 0
  }
}

# 将结果列表转换为数据框并输出
result_df <- data.frame(do.call(rbind, result))
colnames(result_df) <- c("start_day", "days")
result_df$end_day <- result_df$start_day + result_df$days - 1
result_df$start_date <- weather$date[result_df$start_day]
result_df$end_date <- weather$date[result_df$end_day]
result_df <- transform(result_df, period = cut(days, breaks = c(-Inf, 2, 4, 6, Inf), 
                                                labels = c("1-2", "3-4", "5-6", "7+")))
result_df <- result_df[, c("start_date", "end_date", "days", "period")]
head(result_df)

其中,假设天气数据文件为"weather.csv",包含两列数据:日期(date)和是否为雨天(rain),其中0表示非雨天,1表示雨天。结果数据框包含四列数据:起始日期(start_date)、结束日期(end_date)、连续雨天数(days)和连续雨天数分段(period)。

注意,上述代码中的分段标准为:1-2天为1-2段、3-4天为3-4段、5-6天为5-6段、7天及以上为7+段。如果需要修改分段标准,可根据实际需要调整代码中的breakslabels参数。

该回答引用ChatGPT GPT-4

运行结果

img

代码

# 加载所需的库
library(tidyverse)
# 加载所需的库
library(dplyr)

# 创建示例数据框
set.seed(123) # 设置随机数种子以获得可重复的结果
date_seq <- seq(as.Date("2022-01-01"), as.Date("2022-01-31"), by = "day")
station_data <- data.frame(
  date = rep(date_seq, 2),
  station = factor(rep(c("A", "B"), each = length(date_seq))),
  precipitation = runif(length(date_seq) * 2, 0, 10),
  sunshine_hours = runif(length(date_seq) * 2, 0, 10)
)

# 现在运行之前的代码块,以使用 station_data 示例数据框

conflicts_prefer(dplyr::filter)

# 定义一个函数来判断连阴雨
is_continuous_rain <- function(data) {
  n <- nrow(data)
  rain_days <- data$precipitation > 0
  sunshine_hours <- data$sunshine_hours < 2

  # 检查条件 a
  if (n >= 4) {
    not_rain_days_a <- sum(!rain_days)
    if (not_rain_days_a <= 1 && all(sunshine_hours[!rain_days])) {
      return(TRUE)
    }
  }

  # 检查条件 b
  if (n >= 7) {
    not_rain_days_b <- sum(!rain_days)
    if (not_rain_days_b <= 2) {
      idx <- which(!rain_days)
      if (diff(idx) != 1 && all(sunshine_hours[!rain_days])) {
        return(TRUE)
      }
    }
  }

  return(FALSE)
}

# 对数据框进行分组
station_data_grouped <- station_data %>%
  group_by(station) %>%
  arrange(date) %>%
  mutate(rain_event = cumsum(precipitation == 0))

# 应用函数,找出满足连阴雨条件的测站日期段
result <- station_data_grouped %>%
  group_by(station, rain_event) %>%
  nest() %>%
  mutate(is_continuous_rain = map_lgl(data, is_continuous_rain)) %>%
  unnest(data) %>%
  filter(is_continuous_rain) %>%
  select(-is_continuous_rain) %>%
  ungroup()
print(result)


使用R语言或Excel处理txt气象数据(以地面降水日值格点数据为例)(小白用滴)
可以借鉴下
https://blog.csdn.net/cheesetaro/article/details/119725161