[R] 고층/상층 기상 자료 (라디오존데)를 이용한 전처리 및 단열선도 (Skew T Log P) 가시화

 정보

  • 업무명     : 고층/상층 기상 자료 (라디오존데)를 이용한 전처리 및 단열선도 (Skew T Log P) 가시화

  • 작성자     : 이상호

  • 작성일     : 2019-12-31

  • 설   명      :

  • 수정이력 :

 

 내용

[특징]

  • 고층/상층 기상 자료 (라디오존데)를 이해하기 위해서 가시화가 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

 

[기능]

  • 고층/상층 기상 자료를 이용한 전처리

  • 단열선도 (Skew T log p) 가시화

 

[활용 자료]

  • 자료명 : 라디오존데

  • 자료 종류 : 관측소 번호, 날짜, 시간, 압력, 고도, 온도, 습도, 풍향, 풍속

  • 영역 : 한반도

  • 확장자 : csv

  • 기간 : 2000년 06월 01일 - 2016년 12월 31일

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 입력 자료를 동일 디렉터리 위치

  • 소스 코드를 실행 (Rscript Visualization_and_Preprocessing_Using_Upper_Weather_Data.R)

  • 가시화 결과를 확인

 

[사용 OS]

  • Windows10

 

[사용 언어]

  • R v3.6.2

  • R Studio v1.2.5033

 

 소스 코드

[명세]

  • 전역 설정

    • 최대 10 자리 설정

    • 폰트 설정

# Set Option
options(digits = 10)
font = "Palatino Linotype"

 

  • 라이브러리 읽기

# Library Load
library(data.table)
library(tidyverse)
library(lubridate)
library(RadioSonde)

 

  • 파일 읽기

# File Read
dfData = fread("total.dat")
colnames(dfData) = c("st", "year", "month", "day", "hour", "minute", "press", "geo", "temp", "dewpt", "dir", "wspd", NA, NA, NA)

dplyr::glimpse(dfData)

 

 

  • Data Frame를 통해 L1 전처리

    • 결측값 (-999.0)을 NA로 변경

    • 연/월/일 숫자를 날짜 형식으로 변경

    • 풍속/풍향을 U/V 벡터로 변환

# Set Data Frame
dfDataL1  = dfData %>%
   replace(., . == -999.0, NA) %>% # Convert -999.0 to NA
   dplyr::mutate(
      dtDate = lubridate::make_date(year, month, day)
      , nYear = lubridate::year(dtDate)
      , nMonth = lubridate::month(dtDate)
      , xranYm = nYear + ((nMonth - 1) / 12.0)
      , uwind = wspd * sin(-dir * pi / 180.0)
      , vwind = wspd * cos(-dir * pi / 180.0)
      )
   
dplyr::tbl_df(dfDataL1)
dplyr::glimpse(dfDataL1)

 

 

 

  • L1 자료를 통해 L2 전처리

    • 기준 기압 (nRefPre)으로 필터

    • 관측소 번호/년/월/기압에 따라 평균, NA 개수, Not NA 개수, 정상화율 계산

# L2 Processing Using L1 Data Frame
nRefPre = c(925, 850, 700, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10, 7, 5, 3, 2, 1.5, 1)

dfDataL2 = dfDataL1 %>%
   dplyr::filter(press %in% nRefPre) %>%
   group_by(st, nYear, nMonth, press) %>%
   summarise(
      nMeanTemp = mean(temp, na.rm = TRUE)
      , nMeanDewpt = mean(dewpt, na.rm = TRUE)
      , nMeanUwind = mean(uwind, na.rm = TRUE)
      , nMeanVwind = mean(vwind, na.rm = TRUE)
      , nMeanWspd = mean(wspd, na.rm = TRUE)
      , nMeanDir = mean(dir, na.rm = TRUE)
      , iNumber = n()
      
      # NA Numer
      , iNumberTempNa = sum(is.na(temp))
      , iNumberDewptNa = sum(is.na(dewpt))
      , iNumberUwindNa = sum(is.na(uwind))
      , iNumberVwindNa = sum(is.na(vwind))
      , iNumberWspdNa = sum(is.na(wspd))
      , iNumberDirNa = sum(is.na(dir))
      
      # Not Na Number
      , iNumberTemp = sum(! is.na(temp))
      , iNumberDewpt = sum(! is.na(dewpt))
      , iNumberUwind = sum(! is.na(uwind))
      , iNumberVwind = sum(! is.na(vwind))
      , iNumberWspd = sum(! is.na(wspd))
      , iNumberDir = sum(! is.na(dir))
      
      # (N-NA)/N * 100 % 
      , iPerExistTemp = (iNumberTemp/ iNumber) * 100.0
      , iPerExistDewpt = (iNumberDewpt / iNumber) * 100.0
      , iPerExistUwind = (iNumberUwind / iNumber) * 100.0
      , iPerExistVwind = (iNumberVwind / iNumber) * 100.0
      , iPerExistWspd = (iNumberWspd / iNumber) * 100.0
      , iPerExistDir = (iNumberDir / iNumber) * 100.0
      ) 

dplyr::glimpse(dfDataL2)

 

 

  • L2 자료를 통해 출력

# Write Using L3 Data Frame
data.table::fwrite(
   dfDataL2
   , sep = ","
   , file = "OUTPUT/dfDataL2.csv"
   , append = FALSE
   , row.names = FALSE
   , col.names = TRUE
   , dateTimeAs = "write.csv"
   , na = NA
)

 

 

  • L2 자료를 통해 L3 전처리

    • 온도, 이슬점온도, U/V 벡터, 풍향, 풍속에서 정상화율 90 % 이상 필터

# L3 Processing Using L2 Data Frame
dfDataL3 = dfDataL2 %>%
   dplyr::filter(
      iPerExistTemp >= 90.0
      , iPerExistDewpt >= 90.0
      , iPerExistUwind >= 90.0
      , iPerExistVwind >= 90.0
      , iPerExistWspd >= 90.0
      , iPerExistDir >= 90.0
      )

dplyr::glimpse(dfDataL3)

 

 

  • L3 자료를 출력

# Write Using L3 Data Frame
data.table::fwrite(
   dfDataL3
   , sep = ","
   , file = "OUTPUT/dfDataL3.csv"
   , append = FALSE
   , row.names = FALSE
   , col.names = TRUE
   , dateTimeAs = "write.csv"
   , na = NA
)

 

  • L3 자료를 통해 L4 전처리

    • 관측소 번호, 년, 월을 각각 186, 2016, 12에 대해 필터

    • 이름 변경 (예시. nMeanTemp → Temp)

# L4 Processing Using L3 Data Frame
dfDataL4 = dfDataL3 %>%
   dplyr::filter(
      st == 186
      , nYear == 2016
      , nMonth == 12
      ) %>%
   dplyr::rename(
      temp = nMeanTemp
      , dewpt = nMeanDewpt
      , uwind = nMeanUwind
      , vwind = nMeanVwind
      , wspd = nMeanWspd
      , dir = nMeanDir
      )

dplyr::glimpse(dfDataL4)

 

 

  • plotsonde 라이브러리를 통해 가시화

# Visualization Using plotsonde
png("Fig/SkewT_LogP.png", width = 1000, height = 1200, res = 140)

RadioSonde::plotsonde(dfDataL4, winds = FALSE, col = c(2, 4), lw = 2)

dev.off()

 

그림. 상층 기상 자료를 이용한 단열선도 (Skew T Log P) 가시화.

 

[전체]

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com