################################################################################ # - 레이다유량계 : RFM # - 초음파수위계 : UWL # - 초음파관유량계(S) : PFS # - 기상관측계 : CWS # - 지하수위계 : GWL # - 다층 토양수분계 : MSM iwmp.convert.exported.data.to.station.data <- function(EnvList){ library(data.table) library(dplyr) library(tidyr) prjdir <- EnvList$prjdir sensor.type <- EnvList$sensor.type station.ids <- EnvList$station.ids start_year <- EnvList$start_year end_year <- EnvList$end_year raw.dir <- file.path(prjdir, "01_download") stn.dir <- file.path(prjdir, "02_extracted.station") if(!dir.exists(stn.dir)) dir.create(stn.dir, showWarnings = F, recursive = T) flist <- list.files(raw.dir, pattern = glob2rx("*.csv"), full.names = F) if(any(sensor.type == "all")){ stypes <- unique(matrix(unlist(strsplit(flist, "-")), nrow=length(flist), byrow=T)[,1]) } else { stypes <- sensor.type } for(i in 1:length(stypes)){ stype <- stypes[i] if(any(sensor.type == "all")){ flist <- list.files(raw.dir, pattern = glob2rx(sprintf("%s*-all*.csv", stype)), full.names = T) data.list <- list() for(j in 1:length(flist)){ fname <- flist[j] data.list[[j]] <- read.csv(fname, skip = 1, header=F) } data.dt <- data.table::rbindlist(data.list) ## add column names of raw data --> change to function if(stype == "cws"){ colnames(data.dt) <- c("id", "date", "hr", "prcp", "temp", "dew", "rhum", "wspd", "wdir", "rsds", "sshine", "lux", "pet", "presure", "bat") } if(stype == "msm"){ colnames(data.dt) <- c("id", "date", "hr", "sm10", "st10", "sm20", "st20", "sm30", "st30", "sm40", "st40", "sm50", "st50", "bat") } if(stype == "pfs"){ colnames(data.dt) <- c("id", "date", "flow.day", "flow.acu", "flow.sen", "para", "bat") } if(stype == "rfm"){ colnames(data.dt) <- c("id", "date", "hr", "vel00", "vel05", "vel10", "vel15", "vel20", "vel25", "vel30", "vel35", "vel40", "vel45", "vel50", "vel55", "dep00", "dep05", "dep10", "dep15", "dep20", "dep25", "dep30", "dep35", "dep40", "dep45", "dep50", "dep55", "h.ref", "bat") } if(stype == "uwl"){ colnames(data.dt) <- c("id", "date", "hr", "dep00", "dep05", "dep10", "dep15", "dep20", "dep25", "dep30", "dep35", "dep40", "dep45", "dep50", "dep55", "dep.avg", "h.ref", "bat") } stnids <- unique(data.dt$id) for(j in 1:length(stnids)){ stnid <- stnids[j] stn.dt <- as.data.table(data.dt[which(data.dt$id == stnid), ]) if(stype == "cws"){ stn.dt <- setorder(stn.dt, date) stn.dt <- setDT(stn.dt)[, c("bat") := NULL] stn.dt$time <- as.POSIXct(sprintf("%s %02d:00:00", stn.dt$date, as.numeric(stn.dt$hr))) stn.dt$time <- format(stn.dt$time, format = "%Y-%m-%d %H:%M:%S") stn.dt$time <- as.character(stn.dt$time) first.date <- as.Date(sprintf("%d-01-01", start_year)) min.date <- min(stn.dt$date) if(min.date > first.date ) { sdate <- as.Date(min.date) } else { sdate <- as.Date(first.date) } last.date <- as.Date(sprintf("%d-12-31", end_year)) max.date <- max(stn.dt$date) if(max.date < last.date ) { edate <- as.Date(max.date) } else { edate <- as.Date(last.date) } stime <- as.POSIXct(sprintf("%s 01:00:00", sdate)) etime <- as.POSIXct(sprintf("%s 01:00:00", edate)) time.ref <- seq(from = stime, to = etime, by = "hour") time.ref <- as.data.table(format(time.ref, format = "%Y-%m-%d %H:%M:%S")) setnames(time.ref, old = names(time.ref), new = "time") stn.out <- dplyr::left_join(time.ref, stn.dt) stn.out$id <- stnid stn.out <- setDT(stn.out) stn.out <- stn.out[, c("date", "hr", "id") := NULL] } if(stype == "msm"){ stn.dt <- setorder(stn.dt, date, hr) stn.dt <- stn.dt[, bat := NULL] cols_to_check <- 3:ncol(stn.dt) cols_to_remove <- names(stn.dt)[cols_to_check][sapply(stn.dt[, ..cols_to_check], function(x) sum(x) == 0)] stn.dt <- as.data.table(stn.dt[, !cols_to_remove, with = FALSE]) stn.dt$hr <- stn.dt$hr + 1 stn.dt$time <- as.POSIXct(sprintf("%s %02d:00:00", stn.dt$date, stn.dt$hr)) stn.dt$time <- format(stn.dt$time, format = "%Y-%m-%d %H:%M:%S") stn.dt$time <- as.character(stn.dt$time) first.date <- as.Date(sprintf("%d-01-01", start_year)) min.date <- min(stn.dt$date) if(min.date > first.date ) { sdate <- as.Date(min.date) } else { sdate <- as.Date(first.date) } last.date <- as.Date(sprintf("%d-12-31", end_year)) max.date <- max(stn.dt$date) if(max.date < last.date ) { edate <- as.Date(max.date) } else { edate <- as.Date(last.date) } stime <- as.POSIXct(sprintf("%s 01:00:00", sdate)) etime <- as.POSIXct(sprintf("%s 01:00:00", edate)) time.ref <- seq(from = stime, to = etime, by = "hour") time.ref <- as.data.table(format(time.ref, format = "%Y-%m-%d %H:%M:%S")) setnames(time.ref, old = names(time.ref), new = "time") stn.out <- dplyr::left_join(time.ref, stn.dt) stn.out$id <- stnid stn.out <- setDT(stn.out) stn.out <- stn.out[, c("date", "hr", "id") := NULL] } if(stype == "pfs"){ stn.dt <- setorder(stn.dt, date) stn.dt <- stn.dt[, bat := NULL] first.date <- as.Date(sprintf("%d-01-01", start_year)) min.date <- min(stn.dt$date) if(min.date > first.date ) { sdate <- as.Date(min.date) } else { sdate <- as.Date(first.date) } last.date <- as.Date(sprintf("%d-12-31", end_year)) max.date <- max(stn.dt$date) if(max.date < last.date ) { edate <- as.Date(max.date) } else { edate <- as.Date(last.date) } time.ref <- seq(from = sdate, to = edate, by = "day") time.ref <- as.data.table(format(time.ref, format = "%Y-%m-%d")) setnames(time.ref, old = names(time.ref), new = "date") stn.dt$date <- as.character(stn.dt$date) stn.out <- dplyr::left_join(time.ref, stn.dt) stn.out$id <- stnid stn.out <- setDT(stn.out) stn.out <- stn.out[, c("id", "flow.sen") := NULL] } if(stype == "rfm"){ stn.dt <- setorder(stn.dt, date) stn.dt <- setDT(stn.dt)[, c("bat") := NULL] first.date <- as.Date(sprintf("%d-01-01", start_year)) min.date <- min(stn.dt$date) if(min.date > first.date ) { sdate <- as.Date(min.date) } else { sdate <- as.Date(first.date) } last.date <- as.Date(sprintf("%d-12-31", end_year)) max.date <- max(stn.dt$date) if(max.date < last.date ) { edate <- as.Date(max.date) } else { edate <- as.Date(last.date) } stime <- as.POSIXct(sprintf("%s 01:00:00", sdate)) etime <- as.POSIXct(sprintf("%s 23:55:00", edate)) time.ref <- seq(from = stime, to = etime, by = "5 min") time.ref <- as.data.table(format(time.ref, format = "%Y-%m-%d %H:%M:%S")) colnames(time.ref) <-"time" # https://blog.naver.com/regenesis90/222357629320 vel.long <- stn.dt %>% tidyr::pivot_longer(cols = starts_with('vel'), names_to = 'minute', values_to = 'velocity') %>% mutate(minute = as.numeric(gsub("vel", "", minute))) %>% mutate(time = as.POSIXct(paste(date, sprintf("%02d:%02d:00", hr, minute)), format = "%Y-%m-%d %H:%M:%S")) %>% dplyr::select(time, velocity) %>% arrange(time) dep.long <- stn.dt %>% tidyr::pivot_longer(cols = starts_with('dep'), names_to = 'minute', values_to = 'depth') %>% mutate(minute = as.numeric(gsub("dep", "", minute))) %>% mutate(time = as.POSIXct(paste(date, sprintf("%02d:%02d:00", hr, minute)), format = "%Y-%m-%d %H:%M:%S")) %>% dplyr::select(time, depth, h.ref) %>% arrange(time) vel.long <- as.data.table(vel.long) dep.long <- as.data.table(dep.long) vel.long$time <- format(vel.long$time, format = "%Y-%m-%d %H:%M:%S") dep.long$time <- format(dep.long$time, format = "%Y-%m-%d %H:%M:%S") stn.out <- dplyr::left_join(time.ref, vel.long, by="time") stn.out <- dplyr::left_join(stn.out, dep.long, by="time") } if(stype == "uwl"){ stn.dt <- setorder(stn.dt, date) stn.dt <- stn.dt[, c("bat", "dep.avg") := NULL] first.date <- as.Date(sprintf("%d-01-01", start_year)) min.date <- min(stn.dt$date) if(min.date > first.date ) { sdate <- as.Date(min.date) } else { sdate <- as.Date(first.date) } last.date <- as.Date(sprintf("%d-12-31", end_year)) max.date <- max(stn.dt$date) if(max.date < last.date ) { edate <- as.Date(max.date) } else { edate <- as.Date(last.date) } stime <- as.POSIXct(sprintf("%s 00:05:00", sdate)) etime <- as.POSIXct(sprintf("%s 23:55:00", edate)) time.ref <- seq(from = stime, to = etime, by = "5 min") time.ref <- as.data.table(format(time.ref, format = "%Y-%m-%d %H:%M:%S")) colnames(time.ref) <-"time" # https://blog.naver.com/regenesis90/222357629320 dep.long <- stn.dt %>% tidyr::pivot_longer(cols = starts_with('dep'), names_to = 'minute', values_to = 'depth') %>% mutate(minute = as.numeric(gsub("dep", "", minute))) %>% mutate(time = as.POSIXct(paste(date, sprintf("%02d:%02d:00", hr, minute)), format = "%Y-%m-%d %H:%M:%S")) %>% dplyr::select(time, depth, h.ref) %>% arrange(time) dep.long$time <- format(dep.long$time, format = "%Y-%m-%d %H:%M:%S") stn.out <- dplyr::left_join(time.ref, dep.long, by="time") } OldDFiles <- list.files(stn.dir, pattern = glob2rx(sprintf("%s-%s-%s_*.csv", stype, stnid, gsub("-", "", sdate))), full.names = T) file.remove(OldDFiles) OutDFile <- file.path(stn.dir, sprintf("%s-%s-%s_%s.csv", stype, stnid, gsub("-", "", sdate), gsub("-", "", edate))) fwrite(stn.out, OutDFile, na="") } # Station IDs } # If sensor type is all } # Sensor types }