R语言:指定时段降雨时将当日Rain_Binary全设为1的实现
解决思路:指定时段降雨则标记当日特定区间为1
很高兴你已经找到了无需额外包的解决方案!我来帮你梳理下逻辑,同时给个小优化建议提升代码效率~
先明确你的需求
- 你有一个按10分钟间隔记录的降雨时间序列数据集
- 核心需求:如果每天6:30-9:00之间有降雨,就把当天6:30到20:00的
Rain_Binary列全部设为1 - 你之前的代码只能标记降雨发生的时段,现在需要扩展到当日的指定区间
测试数据集
先回顾你提供的测试数据,用来验证逻辑:
start <- as.POSIXct("2015-05-05 06:00:00", format="%Y-%m-%d %H:%M:%S") end <- as.POSIXct("2015-05-07 20:00:00", format= "%Y-%m-%d %H:%M:%S") Time=seq.POSIXt(start, end, by="10 min") MyData=data.frame(Time=Time,Rain=rep(0,(length(Time))),Rain_Binary=rep(0,(length(Time)))) # 模拟降雨:5月5日6:10-6:30、5月6日7:10-7:40、5月7日8:00-8:40有降雨 MyData[c(2:4,154:157,324:328),2]=5
你的解决方案(无需额外包)
你写出的代码逻辑完全正确,我给它加上注释让可读性更强:
# 遍历数据集中的每一行 for (Z in 1:nrow(MyData)) { # 提取当前行对应的日期(YYYY-MM-DD格式) Today= substr(MyData[Z,1], 1, 10) # 判断当天6:30-9:00时段是否存在降雨(只要有一次Rain>0就满足) if(any(MyData$Rain[((MyData$Time>= strptime(paste(Today, "06:30:00"),format="%Y-%m-%d %H:%M:%S"))& (MyData$Time<= strptime(paste(Today, "09:00:00"),format="%Y-%m-%d %H:%M:%S")))]>0)) { # 满足条件时,将当天6:30-20:00的Rain_Binary全部设为1 MyData$Rain_Binary[(MyData$Time>=strptime(paste(Today, "06:30:00"),format="%Y-%m-%d %H:%M:%S"))& (MyData$Time<= strptime(paste(Today, "20:00:00"),format="%Y-%m-%d %H:%M:%S"))]=1 } }
代码逻辑拆解
- 按日期判断:通过
substr提取每行的日期,确保我们针对每一天做独立判断 - 降雨检测:用
any()函数检查当日指定时段的降雨数据,只要有一次降雨就触发标记 - 批量标记:一旦检测到降雨,就把当日6:30到20:00的所有
Rain_Binary值设为1
可选优化:提升大数据集处理效率
如果你的数据集行数很多,逐行循环可能会有点慢。可以先一次性找出所有符合条件的日期,再批量标记,效率更高:
# 给数据集新增日期列,方便分组处理 MyData$Date <- as.Date(MyData$Time) # 找出所有在6:30-9:00有降雨的日期 rainy_dates <- unique(MyData$Date[ MyData$Time >= strptime(paste(MyData$Date, "06:30:00"), "%Y-%m-%d %H:%M:%S") & MyData$Time <= strptime(paste(MyData$Date, "09:00:00"), "%Y-%m-%d %H:%M:%S") & MyData$Rain > 0 ]) # 批量标记这些日期的6:30-20:00区间 MyData$Rain_Binary[ MyData$Date %in% rainy_dates & MyData$Time >= strptime(paste(MyData$Date, "06:30:00"), "%Y-%m-%d %H:%M:%S") & MyData$Time <= strptime(paste(MyData$Date, "20:00:00"), "%Y-%m-%d %H:%M:%S") ] <- 1
这个方法和你的原代码结果完全一致,但避免了重复判断同一日期,处理大数据集时速度会更快。
内容的提问来源于stack exchange,提问作者Saalva
相关产品推荐
相关产品推荐

