반응형

     정보

    • 업무명     : 고층/상층 기상 자료 (라디오존데)를 이용한 전처리 및 단열선도 (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
     
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기