정보
-
업무명 : 2017년 2학기 전선 기상 정보학 실습 및 과제물
-
작성자 : 이상호
-
작성일 : 2020-03-21
-
설 명 :
-
수정이력 :
내용
[개요]
-
안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.
-
오늘은 대학원 석사 4학기에 배운 기상 정보학에 대한 내용을 다루고자 합니다.
-
이 교과목은 주로 파이썬 (Python)를 이용한 기초 및 활용 (기상 자료 처리 및 가시화)를 내포하고 있습니다.
-
특히 배운 지식를 활용하여 각 주차별 발표 및 토의는 학술 논문 또는 보고서를 작성 시 많은 도움이 되었습니다.
-
오늘 포스팅에서는 기상 정보학의 실습 및 과제물을 소개해 드리고자 합니다.
[특징]
-
기상정보학 수업에 대한 이해를 돕기위해 작성
[기능]
-
실습
-
과제물
-
강릉원주대 (Gangneung-Wonju National University, GWNU) 복사 관측소 (Radiation Observation Station)를 이용하여 자료 읽기 및 저장
-
지상 관측 자료 (아스키 파일)를 이용하여 NetCDF 변환한 후 시계열 그래프 그리기
-
GPCP 강우강도 자료를 이용하여 사막 영역을 마스킹하고 해당 영역에 대한 ECMWF 기온 표출
-
히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES) 자료를 이용하여 지표면 및 대기상단에서의 단파복사 산출 및 비교 분석
-
[사용 OS]
-
Windows 10
[사용 언어]
-
Power Point 2018
-
Python v2.7.3
실습
-
실습에 필요한 패키지 목록
cdat-5.2.tar.bz2
EasyNC.tgz
2.12.yml
hdf5-1.8.19-linux-centos7-x86_64-gcc485-shared.tar.gz
netcdf-c-4.4.1.1.tar.gz
netcdf-fortran-4.4.4.tar.gz
pyqt-4.11.3-py27_1.tar.bz2
PyQt-x11-gpl-4.11.3.tar.gz
qt-everywhere-opensource-src-4.8.6.tar.gz
-
실습에 필요한 도구 목록
putty-0.70-installer.msi
putty-64bit-0.70-installer.msi
텍스트 파일 읽기/쓰기 (open, readline, print, write, close)
abc = raw_input()
abc
abc = raw_input("model name?")
f = open("새파일.txt", "w")
f.close()
food = "python\'s favorite food is perl"
print(food)
"I eat %d apples." % 3
"pi is %10.6f" %3.141592
3*("%f10.2") %(-1.0, -2.9, -3.0)
2*("%f4.0") %(-1.0, -2.9)
## Test
f = open("rain.txt", "w")
rain_seoul = range(0, 999, 3)
rain_busan = range(0, 999, 33)
rain_gangneung = range(0, 999, 100)
year = range(2011, 2018)
for i in range(7):
writeline = 4*("%4d") %(year[i], rain_seoul[i], rain_busan[i], rain_gangneung[i])
f.write(writeline+"\n")
f.close()
f = open("rain.txt", "r")
#id = f.readline()
for i in range(6):
#for year in range(2011, 2017):
adata = f.readline()
list_a=adata.split()
print list_a[0], list_a[1], list_a[2], list_a[3]
f.close()
dd = df.to_csv("rain.txt")
fname = "gwnu_precip.txt"
fname.replace('precip', 'temp')
start_year = 1991
end_year = 2010
fname = 'pr_'+str(start_year)+str(end_year)+'.txt'
yyyymm = str(2015)+str(9).zfill(2)
print(yyyymm)
NumPy와 배열 만들기
# http://aikorea.org/cs231n/python-numpy-tutorial/
import numpy as np
# numpy를 load하고 닉네임을 np로 부여
# np.function
# numpy.function
from numpy import *
# 패키지 내에 모든 function을 불러옴
from numpy import 함수명
# numpy내에서 특정 function만 불러옴
########################################
alist=[[1,2,3],[4,5,6]]
alist[0][1]
# list내에 list 형태
aaa = np.array(alist)
aaa[0,1]
# 배열 형태
aaa.shape # 배열 형태
aaa.ndim # 차원
aaa.size # 크기
########################################
# 파일에서 데이터를 읽어올때는 초기화 필요(선언)
# aaa = np.arry()
a = np.zeros((2,2)) # 모든 값이 0인 배열 생성
print a # 출력 "[[ 0. 0.]
# [ 0. 0.]]"
b = np.ones((1,2)) # 모든 값이 1인 배열 생성
print b # 출력 "[[ 1. 1.]]"
c = np.full((2,2),7) # 모든 값이 특정 상수인 배열 생성
print c # 출력 "[[ 7. 7.]
# [ 7. 7.]]"
d= np.eye(2) # 2x2 단위행렬 생성
print d # 출력 "[[ 1. 0.]
# [ 0. 1.]]"
e = np.random.random((2,2)) # 임의의 값으로 채워진 배열 생성
print e # 임의의 값 출력 "[[ 0.91940167 0.08143941]
# [ 0.68744134 0.87236687]]"
f = np.empty((3,3))
print f
##############################################################################
aaa[:,:]
aaa[:]
aaa[0,:]
aaa[-1,-1]
type(aaa)
aaa.dtype
x = np.array([1, 2]) # Numpy가 자료형을 추측해서 선택
print x.dtype # 출력 "int64"
x = np.array([1.0, 2.0]) # Numpy가 자료형을 추측해서 선택
print x.dtype # 출력 "float64"
x = np.array([1, 2], dtype=np.int64) # 특정 자료형을 명시적으로 지정
print x.dtype # 출력 "int64"
# x = np.array([[1,2],[3,4]], dtype=np.float64)
# y = np.array([[5,6],[7,8]], dtype=np.float64)
##############################################################################
alist=[[1,2,3],[4,5,6]]
aaa = np.array(alist)
b=aaa.reshape([aaa.size])
b
dir(aaa)
###############################################################################
import numpy as np
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
print x + y
print np.add(x, y)
# 요소별 합; 둘 다 다음의 배열을 만듭니다
# [[ 6.0 8.0]
# [10.0 12.0]]
print x - y
print np.subtract(x, y)
# 요소별 차; 둘 다 다음의 배열을 만듭니다
# [[-4.0 -4.0]
# [-4.0 -4.0]]
print x * y
print np.multiply(x, y)
# 요소별 곱; 둘 다 다음의 배열을 만듭니다
# [[ 5.0 12.0]
# [21.0 32.0]]
# 행렬 연산 아님, 단순 배열 요소간 곱
print x / y
print np.divide(x, y)
# 요소별 나눗셈; 둘 다 다음의 배열을 만듭니다
# [[ 0.2 0.33333333]
# [ 0.42857143 0.5 ]]
print np.sqrt(x)
print x**0.5
# 요소별 제곱근; 다음의 배열을 만듭니다
# [[ 1. 1.41421356]
# [ 1.73205081 2. ]]
###############################################################################
x = np.array([[1,2],[3,4]])
print np.sum(x) # 모든 요소를 합한 값을 연산; 출력 "10"
print np.sum(x, axis=0) # 각 열에 대한 합을 연산; 출력 "[4 6]"
print np.sum(x, axis=1) # 각 행에 대한 합을 연산; 출력 "[3 7]"
EasyNC 및 CDAT 소개
인스톨 가이드
ncdf 4를 설치하려면 hdf5를 사용해야됨. 기본적으로 설치 되어 있음.
c, c++, gfotran
m4, zlib, (알집)
sudo yum –y install gcc-g++
sudo yum –y gcc-gfortran
## 4가지는 필수 필요한 방법.
sudo yum –y install m4
sudo yum –y install zlib-devel
sudo syum –y install libcurl-devel
Download hdf5 binary file
(https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.16/obtain51816.html)
## 자동 설치하지말고 집에서 다운로드 함.
인스톨하기 전에 hdf5
자동으로 환경설정되는 부분
/lib
/lib64
/usr/lib
/usr/lib64
내가 자동으로 설정하여 설치파일
/usr/local/lib
/usr/local/netcdf
include
bin
lib
## NeCDF 파일 설치하는 방법.
READ INSTALL.md
CPPFLAGS=“-I/usr/local/hdf5/include –I/usr/include/curl”
## 그 안에 폴더까지 있어서 설정할 필요가 있음.
LDFLAGS=-L/usr/local/hdf5/lib ./configure —prefix=/usr/local/netcdf
## Libray 링크 해주는 부분. 이어서 한줄씩 이어서 설치하면 됨.
## 설치할 때 경로를 잡아서 설치해줄 필요가 있음. prefix은 여러분 홈디렉토리에 설정하면됨.
sudo make
컴파일
sudo make install
컴파일 하면 오브젝트 파일이 생겨 이를 실행함.
make check
nctcdf_c를 설치하면 ncfcdf_forrtran을 설치한는 방법
## ncedf_fortran 설치 방법.
CPPFLAGS="-I/usr/local/hdf5/include –I/usr/include/curl
-I/usr/local/netcdf/include" LDFLAGS="-L/usr/local/hdf5/lib
-L/usr/local/netcdf/lib" ./configure —prefix=/usr/local/netcdf
sudo make
sudo make install
make check
nc-config —all
# tar.gz를 이용하여 버전을 맞춰서 설치할 필요가 있음.
nc –config –-all을 설치하는 방법임.
pgfortan , fflags, flibs을 EASYNC를 설치하는 방법
EasyNC 설치방법.
cd ../EasyNC
rm –f *.mod *.o
-g은 fortran 컴파일을 이용하여 디버깅할 때 쓰는 명령어.
vi readmc
vi makefile : pgfortran, --flags을 이용함. flibs은 nc_libfalss로 변환.
컴파일을 위한 용도.
vi Makefile.user :pgfortran , FFLAGS은 Fflags
make만 하면됨.
ls –l bin -> 바이너리 파일을 이용하여 써야됨.
echo $SHELL
vi ~/.bashrc: ## EastNC
export EasyNC = /data/guest00/programs/EasyNC
export PATH=$EasyNC/bin:${PATH} 이 시스템 환경 변수를 설정함.
cd samples
cd data
ncdump –h *
ls ../../bin에서
which eznc_copy_att가 안나와서
source ~./.bashrc을 하면 제대로 나옴.
이것을 어디서도 쓸수가 있음.
cp tas_ERA40_2000.nc t2m.nc
ncdump –h t2m.nc
eznc_rename t2m.nc t2m sat
####################################################
cd cdat-5.2.cat
./
# 페도라 자동 설치
sudo yum –y install pyqt4
sudo yum –y install pyqt4-devel (devel은 개발자 모드)0
export LD_LIBRARY_PATH=/usr/lib/gcc:${LD_LIBRARY_PATH}
## 자기 시스템 환경에 안맞아서 Error가 발생됨. 서로 버전가 상이하게 발생되어 문제가 발생됨.
conda create -n uvcdat-2.12 uvcdat -c conda-forge –c uvcdat
환경변수가 설정되어됨. conda은 새롭게 인스톨하게 하는 방법. conda를 직접 다운로드 받아서 직접 설치 후 해야됨. 가이드라인 참고해야함. pyqt4와 Netcdf가 많음.
2.12를 개발자 사용했던 콘다 환경이 있음. nctcdf 4.5은 오류가 발생하였으나 4.4.1은 발전 됨. 어떤 프로그램이 많아서 할 수가 없음.
cdat는0 CMIP에서 cmor를 통해 표준 데이터 환경을 변환해줌.
(https://github.com/UV-CDAT)
make install
matplotlib 경우 따로 설치해야 됨. 설명서에 참조하여 설정.
precip.mon.mean.nc 자료를 ver2.3을 이용하여 사용함. 데이터에 대한 정보를 갖고 있어야 됨. 2.5*2.5을 이용함. Detailed Description + 사사 문구 사용. Reference를 사용하고 미싱데이터 값. 사용함.
ncdump –h *.nc를 보면 해당 자료에 대한 정보가 자세히 나옴. 한 격자의 평균을 가지고 오나 buds은 격자 경계에 해당하는 부분. 좌우, 상하, 그대로 써야됨.
/data/guest00/cdat test_cday 해보라는 방법임.
LD_LIBRARY_PATH=/usr/local/netcdf/413_---eznc_rename t2m.nc latitude lat
eznc_rename t2m.nc longitude lons
eznc_copy_att: 새로운 파일에 대한 부가적인 정보를 복사.
eznc_puy_att:
eznc_put_att t2m.nc global author hojeong_shin (개쩐다).
256자 (2줄) 안넘기게 사용하면 됨. 2가지만 써도 필요함. 다른 응용 프로그램에서 축 이름 등 여러 가지를 바꿔야 됨.
샘플로 muifa_ysu 자료는 WRF 자료를 많이 따라서 해보는 것이 숙제
make clean이 잘 안될 경우 make claen all을 사용할 경우도 있음.
우리나라 PGI는 crack 버전을 해주나 실제로는 정품도 함. PGI는 GCC에 비해 좋으나 지금은 GCC 큰 차이가 없음. GCC는 공짜임. intel은 최적화에 능하기 때문에 유료임.
make –j8은 CPU의 개수에 따라서 실행해주는 명령어임.
###################################
cdo -f nc copy programs/precip.mon.mean.nc gpcp.nc
fortran90을 가지고 fortran 77 문법으로 이용하였으나 nc –config —all를 보면 netcdf fortran은 링크가 되어 있지 않아 발생된 오류임.
netcdf 설치할 경우 fortran, c를 설치해야됨. 여러분 리눅스에 설치해야됨.
netcdf 파일 처리할떄 cdat를 처리하는게 너무 편리함.
UV-CDAT은 수많은 짬뽕이고 해당 모듈 및 설명서를 볼수가 있음.
이것도 EASYNC처럼 편리함.
PDF 파일에서
long name 또는 standard name가 유사함. Units은 켈빈으로 사용함. 위경도 값을 따로 알려줌.
attributes.Keys()은 파이썬 딕션어리를 이용하여 리스트 해줌.
MV2는 마스킹 기능이 파워풀함.
cdms2는 크게 MV는 부가적인 정보를 추가 할수 있으나 자동으로 축 정보를 따라감.
평균을 계산하면 다시 cdms2를 자동으로 추가됨.
typecode=f(실수), d(배정도)
MV2.float 32/64
np.float 32/64
np.int
MV2.int을 쓰지 않으면 float 64로 들어갈 것임.
fill_value은 결측값.
축 이름이 level을 읽을 수 있으나 그것이 안될 경우 getAxis(2)으로 설정하여 추출해야됨.
평균을 할떄 MV2 모듈을 쓰는게 편함. 해당 정보가 그대로 따라옴.
time 축에 대해서 축번 및 축값 쓰면 됨. Missing 값은 새롭게 할 수 있음.
## 원활한 기상정보학 수업을 위한 패키지 및 라이브러리 설치
## ncdf4를 설치하려면 hdf5를 사용해야됨. 기본적으로 설치 되어 있음.
c, c++, gfotran
m4, zlib, (알집)
sudo yum –y install gcc-g++
sudo yum –y gcc-gfortran
## 4가지는 필수 설치.
sudo yum –y install m4
sudo yum –y install zlib-devel
sudo syum –y install libcurl-devel
Download hdf5 binary file
(https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.16/obtain51816.html)
## 자동 설치하지말고 집에서 다운로드 함.
인스톨하기 전에 hdf5
자동으로 환경설정되는 부분
/lib
/lib64
/usr/lib
/usr/lib64
## 내가 자동으로 설정하여 설치파일
/usr/local/lib
/usr/local/netcdf
include
bin
lib
## Netcdf 파일 설치하는 방법.
READ INSTALL.md
CPPFLAGS=“-I/usr/local/hdf5/include –I/usr/include/curl”
## 그 안에 폴더까지 있어서 설정할 필요가 있음.
LDFLAGS=-L/usr/local/hdf5/lib ./configure —prefix=/usr/local/netcdf
## Library 링크 해주는 부분. 한줄씩 이어서 설치하면 됨.
## 해당 경로에 대해서 설치할 것을 추천함. prefix은 홈디렉토리에 설정하면 됨.
sudo make
컴파일
sudo make install
컴파일 하면 오브젝트 파일이 생겨 이를 실행함.
make check
nctcdf_c를 설치하면 ncfcdf_forrtran을 설치해야 됨.
## ncedf_fortran 설치 방법.
CPPFLAGS="-I/usr/local/hdf5/include –I/usr/include/curl
-I/usr/local/netcdf/include" LDFLAGS="-L/usr/local/hdf5/lib
-L/usr/local/netcdf/lib" ./configure —prefix=/usr/local/netcdf
sudo make
sudo make install
make check
nc-config —all
## tar.gz을 버전에 맞게 설치할 필요가 있음.
nc –config –-all을 설치하는 방법임.
pgfortan , fflags, flibs을 EASYNC를 설치하는 방법
# EasyNC 설치방법.
cd ../EasyNC
rm –f *.mod *.o
## -g은 fortran 컴파일을 이용하여 디버깅할 때 쓰는 명령어임.
vi readmc
vi makefile : pgfortran, --flags을 이용함. flibs은 nc_libfalss로 변환.
## 컴파일을 위한 용도임.
vi Makefile.user :pgfortran , FFLAGS은 Fflags
make만 하면됨.
ls –l bin ## 바이너리 파일을 이용하여 써야됨.
echo $SHELL
vi ~/.bashrc: ## EastNC
export EasyNC = /data/guest00/programs/EasyNC
export PATH=$EasyNC/bin:${PATH} ## 이 시스템 환경 변수를 설정함.
cd samples
cd data
ncdump –h *
ls ../../bin에서
which eznc_copy_att가 실행되지 않으면 ~/.bashrc에서 PATH 설정 후 source ~./.bashrc로 실행하면 됨.
cp tas_ERA40_2000.nc t2m.nc
ncdump –h t2m.nc
eznc_rename t2m.nc t2m sat
cd cdat-5.2.cat
./
## 페도라 자동 설치
sudo yum –y install pyqt4
sudo yum –y install pyqt4-devel (devel은 개발자 모드)0
export LD_LIBRARY_PATH=/usr/lib/gcc:${LD_LIBRARY_PATH}
## 자기 시스템 환경에 안맞아서 Error가 발생됨. 서로 버전가 상이하게 발생되어 문제가 발생됨.
conda create -n uvcdat-2.12 uvcdat -c conda-forge –c uvcdat
## 환경변수가 설정되어 됨. conda은 새롭게 인스톨하게 하는 방법. conda를 직접 다운로드 받아서 가이드라인을 참조하여 설치 해야 됨.
cdat는0 CMIP에서 cmor를 통해 표준 데이터 환경을 변환해줌.
(https://github.com/UV-CDAT)
make install
## matplotlib 등의 라이브러리는 최신 버전을 설치해야 됨.
precip.mon.mean.nc의 Header (ncdump –h precip.mon.mean.nc)는 사용되는 버전 및 공간 해상도 (2.5°×2.5°) 뿐만 아니라 사사 문구 및 Missing data 정보가 포함되어 있음.
/data/guest00/cdat test_cday 해보라는 방법임.
LD_LIBRARY_PATH=/usr/local/netcdf/413_---
eznc_rename t2m.nc latitude lat
eznc_rename t2m.nc longitude lons
eznc_copy_att: 새로운 파일에 대한 부가적인 정보를 복사함.
eznc_puy_att:
eznc_put_att t2m.nc global author hojeong_shin (개쩐다).
## 256자 이내로 코딩 할 것을 권고함.
## Easync 폴더에 muifa_ysu 샘플 자료 (WRF 결과 파일)도 있으니 참고.
## make clean이 안될 경우 make claen all을 사용할 것을 추천함.
## 이전에는 PGI 컴파일러 (상용 소프트웨어)는 GCC보다 성능이 좋으나 현재는 GCC (프리웨어)와 큰 차이가 없음. PGI 및 GCC보다 Intel는 유료로서 모듈화 및 표준화에 대한 최적화에 유용함.
## make –j8은 CPU의 개수에 따라 실행해주는 명령어임.
cdo -f nc copy programs/precip.mon.mean.nc gpcp.nc
## 실행시 오류가 발생될 경우 nc config —all을 보면 netcdf fortran가 링크 되어 있지 않아 발생된 오류임.
## Netcdf 설치할 경우 fortran, c이 설치되어 있어야 함.
## UV-CDAT Utilities는 nc 파일을 처리할 때 유용하고 해당 모듈 및 설명서는 https://uvcdat.llnl.gov/index.html 참조하여 볼 수 있음. 특히 MV2 모듈은 마스킹에 파워풀한 기능을 가지고 MV2 모듈 중 cdms2는 자동 축 정보 추출 (해당 정보가 그대로 따라옴) 및 평균을 이용할 수 있음.
## 축 이름이 level로 읽을 수 있으나 혹여나 안될 경우 getAxis(2)으로 설정하여 추출해야 됨.
## 과제 : UV-CDAT Utilities를 이용하여 csv 파일을 읽고, 딕션어디로 축 정보를 정보를 이용하여 Ncdcdf 파일을 만들고 한번 따라서 해보기
#!/bin/python
#===============================================================================
# Routine : Main Python program
#
# Purpose : gpcp_clim.py
#
# Author : Sang-Ho Lee
#
# Revisions: V1.0 November 06, 2017 First release (S.-H. Lee)
#===============================================================================
## user define
# archive_root = 'data/guest00/data'
archive_root = './'
start_year = 1990; end_year = 2016
import cdms2, cdutil, MV2
fin = cdms2.open(archive_root + '/gpcp.nc', 'r')
fin.listvariables()
pr = fin('precip')
pr.shape
pr.max()
print(pr.min())
pr.units
pr.id
pr.long_name
pr.test = 'meteor_information'
pr.info()
# axes = pr.get.Ax
# axes.shape
# len(axes)
time = pr.getAxis(0)
time
lats = pr.getAxis(1)
lats
lons = pr.getAxis(1)
lons
# pr.getTime()
# pr.getLatitude()
# pr.getLevel()
pr_mean2 = MV2.average(pr, axis=0)
pr_mean2.info
pr1 = pr(time=('1979-1-1', '2016-12-31'))
pr1.info
pr_mean2 = MV2.average(pr1, axis=0)
# pr_clim = cdutil.ANNUALCYCLE.climatology (pr)
# 12 monthly mean
pr.missing_value
EasyNC 및 CDAT (cdms2, MV2, cdutill)를 이용하여 NetCDF 편집 및 읽기 (1)
import cdms2, MV2, numpy as np (Python 라이브러리는 연달아 로드할 수 있음)
## cd softare/Easync에서 make 파일을 열면 export은 bash 환경변수 설정.
## ls –l ../bin이 쓸면하면 Eznc_copy_att, eznc_put_att, eznc_rename이 쓸만함.
## samples 자료에서 t2m.nc (2m 지표면 기온)
## cdo (Netcdf 파일에서 원하는 기간에 대해 정보를 추출할 때 유용한 언어)
## cdo –selyear, 2000 precip.mon.mean.nc prec_GPCP_2000.nc (precip.mon.mean.nc에서 2000년일 때 GPCP 정보를 추출하여 prec_GPCP_2000.nc로 저장)
## ncdump –h prec_GPCP_2000.nc > HEAD (헤더파일 생성)
## Easync에서 주로 eznc_rename와 eznc_put_att 및 eznc_copy_att을 이용할 수 있음.
## lats, lons 축 이름이 자세하지 못해 이를 latitude, longitude로 변경함.
eznc_rename t2m.nc lats latitude
eznc_rename t2m.nc lons longitude
ncdump –h t2m.nc (헤더파일 생성)ㅇㅇ
eznc_put_att t2m.nc global class “meteo_info”
eznc_put_att t2m.nc global class “information”
eznc_copy_att t2m.nc
## 연구에서 이용되는 자료는 주로 아스키 (csv, txt)와 바이너리 (bin) 및 과학기술포맷 (위성: hdf, h5; 위성 또는 기후모델: nc; 수치 모델: grib, grib2)로 사용되고 일반적으로 grib 및 hdf는 원도우 상에서 처리하기 어렵기 때문에 ncl_convert2nc를 이용하여 nc로 변경하여 사용함.
#====================================================
# test_get_var.f90
#====================================================
cp test_get_var.f90 read_prec.f90 (리눅스 상에서 파일 저장)
vi read_prec.f90
real, parameter :: mdays
/31, 29, 31, 30, 31,30, 31, 31, 30, 31, 30, 31, 30, 31/
varmean = 0.0
do i=1, nt
Varmean = varmean + varin(:,:,i)*mdays(i)
enddo
varmean = varmean/12.0
## 시간에 따른 가중치를 고려하여 평균함.
din = ‘/data/guest00/data/gpcp.nc’
din = ‘/data/guest00/data’
finname = din+’/gpcp.nc’
fin = cdms2.open(finname, ‘r’)
fin.listvariables()
pr = fin(‘precip’)
pr.shape (데이터 정보 확인)
## 리눅스 상에서 ncview를 통해 대략적인 자료의 분포를 확인할 수 있음.
prmax() ## 강우강도의 최댓값
pr.min() ## 강우강도의 최솟값
Pr.units ## 강우강도의 단위
pr = pr*10*30 ## 단위 변환
Pr.units = ‘cm/month’
Pr2000 = pr(times=(‘’
Fin(filename (문자형),
Fin = cdms2.open(filename, ‘r’)
Pr = fin(‘precip’, time=( ’1979-1-1’, ’2000-12-31’ ), latitude = ( , ), longitude = (,) )
Fin(‘precip’) (time=( , ), latitude = (, ), longitude = (, ))
Pr2000 = pr(time=(‘2000-1-1’, ‘2000-12-31’))을 가져오면
Pr2000.shape (연 강수량이니깐)
Pr2000_sum = MV2.sum(pr2000, axis=0)
Pr2000_sum
Pr2000_sum.info
Pr2000_sum.max(), Pr2000_sum.min()
pr2000_sum = np.sum(pr2000, axis=0)
pr2000_sum.shape
pr2000_sum.info
pr2000_sum.max(), pr2000_sum.min()
cdms2.setNetcdfShuffleFlag(0)
cdms2.setNetcddeflateFlag(0)
cdms2.setNetcdfDeflatelevelFlag(0)
fout = cdms2.open(‘prec2000sum.nc’, ‘w’)
fout.write(aaa, id=’precip’)
fout.close()
find . –name prec2000sum.nc –print
mask_desert = MV2.masked_less(aaa, 25.0)
mask_desert.max(), mask_desert.min()
MV2.masked_equal(var, val) ## var = val
MV2.masked_less(var, val) ## var < val
MV2.masked_greater
_less_equal
_greater_equal
_where(mask, var) ## mask와 var은 size가 동일해야 됨.
mask = MV2.getmask(var_masked) ## mask은 1 또는 0으로 됨.
Import regrid2
Ingrid = regrid2.getGrid(aaa)
Outgrid = aaa.grtGrid()
Ftas = cdms2.open(./data/tas_ERA_40_2000.nc’, ‘r’)
Tas = ftas(‘t2m’)
Tas.shape
Tas2 = tas.regrid(outgrid)
Tas2.shape
Tas = cdms2.createVariable(tas, axes=reec.get.AxisList())
Fout.write(tas, id=’tas’)
Fout.close()
#====================================================
# analysis_kma.py
#====================================================
## str(1973) = ‘1973’
## qc은 적도에서 극으로 갈수록 면적이 감소하기 때문에 면적 평균을 수행해야 함.
cdutil.averager
## t_KMA은 연평균 아노말리
## 이번에는 아노말리 사이즈를 이용하여 42년에 걸쳐 관측소마다 결측값의 개수를 계산을
계산해야함.
## 즉 1행이라도 결측값이 있다면 41개 데이터만 추출됨.
## 축 정보를 포함시키기 위해서 cdms2.createVariale을 사용함.
## 선형회귀 및 통계적 유의수준은 NumPy, SciPy 등이 있음.
## s_kma와 i_kma 그리고 Pt2K_kma은 각각 기온 관측소에 선형관계와 y 절편 그리고 유의수준을 의미함.
## 이 연구에서 전례없는 기후 시기에 대한 자연 변동성 크기를 보기 위해서 아노말리를 이용하여 표준편차 (추세선의 1 시그마)를 계산해야 함.
#====================================================
# csv2nc_kma_ann.py
#====================================================
## 딕션너리로 자료를 읽은 후에 append를 이용하여 리스트에 순차적으로 추가함.
## x축, y축에서 start_year, end_year을 array 형태로 설정함.
## 교수님께서는 만능 프로그램을 코딩하여 사용하는 것을 좋아함.
#====================================================
# cmip5-regrid_clmon.py
#====================================================
해양은 깊이로 되어 있음.
cdo 옵션을 ngrids을 하는 옵션음.
여러가지 내삽 방법이 있으나 generate_wgts
실험 종류에 대해 do 루프를 구동함.
## OUTPUT 디렉토리에 있는 파일명은 정규화된 패턴을 통해 리스트로 저장하는 과정임.
## 파일의 유무를 판단하는 방법(not os.path.exists)
## 이 과정에서 외부 모듈 (cdo, gendis, ngrids: 해상도 조정)을 불러올 수 있음.
## cdo 패키지를 이용하여 100 km 해상도를 공간 일치하는 과정이나 50개 모형을 불러오다보니 에러가 발생할 수 있음. 따라서 자동화시킬 경우 if (modeli==’HadGEMS2-ES’) 조건문을 이용하여 해당 모형을 제외하여 구동함.
## 가중치의 유무에 따라 remap 방법이 다를 수 있으나 일반적으로 remapping를 이용함.
## grid가있을 경우 2차 내삽 (bilinear) 등의 공간 내삽은 사용가능하나 에러가 발생됨.
## 주로 공간 내삽은 bilinear, 역거리 가중치법 (IDW) 주로 사용하고 mass, energy (SCRIP)은 평균뿐만 아니라 ---등 좋은 패키지임.
## regrid을 할 경우 평균은 가급적으로 바뀌지가 않으나 최대/최소이 좋은 방법임.
## cdo 패키지를 이용하여 33개 level로 내삽하는 방법임. 여기서 python은 쉘 프로그래밍 역할을 해줄 수 있음.
## 이 프로그램은 CMIP5을 처리할 수 있는 수십년 간의 노하우가 고스란히 녹아져 있으며 구동하하는데 18 시간 이상이 소요됨.
#====================================================
# ohc_ann1x1_basin.py
#====================================================
## 해역별 (태평양만 등)로 나눠서 면적 평균함.
cdms2를 이용하여 NetCDF 파일 읽고 쓰기 (2)
## 슬라이싱이 하는 방법임.
pr = fin(‘precip’, time=(‘’, latitude =())
pr = pr(lat --)
asia = cdutil.region.domain (latitude=(20, 50), \
longitude=(100, 140) )
## 연구 영역을 조정하는 부분임.
tas = 1X1
pr = 2X2
## 공간 해상도가 다를 경우 면적에 대한 가중치를 자동으로 처리해줌.
cdms2.setAuto.Bounds(‘on’)은 동일한 경계면을 따라옴.
Cdutil.averater(var, ‘xyt’)
‘x’ = zonal mean
‘y’=meridiual mean
‘xy’=areal mean
‘t’=climateology
weight = [‘equal’] ## 1개 축에 대해서만 동등한 가중치를 부여함
weights=[‘generate’, ‘equal’] ## xy의 쓸 경우
action = ‘average’ ## default
‘sum’
pr_ASIA_ts_by_np = np.average(pr_ASIA, axis=(1,2) )
MV2.average(pr_ASIA, acis=(1,2) )
pr_ASIA_clim = cdutl.ANNUALCYCLE.climatology(pr_ASIA)
pr_ASIA_clim = cdutl.ANNUALCYCLE.climatology(pr_ASIA(time=(‘1981-1-1’, ‘2010-12-31’)))
#====================================================
# fig_korea_timeserise.py
#====================================================
fig =plt.figure()
import cdms2
import MV2
import cdutil
import numpy as np
fig=plt.figure()
p1 = fig.add.subplot (221)
x1 =np.arrange(
p1.plot(x1, pr_ASIA_ta)
print len(x1), len(pr_ASIA_ta)
Report : -5-5 (5S~5N), 210-270 영역에 대해 지표면 기온의 아노말리를 그리시오(https://uvcdat.llnl.gov/documentation/utilities/utilities-1.html).
matplotlib 소개
conda env list
conda env remove –n acme_diag_env
conda create –n uvcdat uvcdat
-c conda-forge –c uvcdat
-c doutriaux1
#====================================================
# fig_ano_trend.py
#====================================================
## 1973-2015년에 대해 KMA와 NASA 관측소의 온도 및 아노말리 추세 분석할 수 있음.
fig =plt.figure() ## 그림 파일 이름 설정함
## maplotlib의 경우 pyploalt만 이용하고 scipy.stats는 lineregress만 로드함.
## Ano_giss(S_KOREA)는 남한 영역에 대한 면적 평균을 하고 Ano_giss의 경우 전구 영역에 대한 면적 평균함. 그리고 taxis와 saxis는 각각 시간과 관측소 지점을 의미함.
## Python에서 줄 바꿈은 ;이고 이어 쓰기는 \임.
## KMA 또는 NASA 관측 자료는 missing value 또는 fill value로 정의되어 있기 때문에 다음과 같이 NAN 값으로 바꿔줌.
## nyrs_kma은 해당 관측소마다 자료의 개수를 나타내며 size_kma은 각 연도별 자료의 개수를 의미함.
## avg_ano_giss_glb은 시간에 대해 평균함.
## subplot은 1 by 1에 첫번째를 의미하고 최대 가로 9개 및 세로 9개로 표출할 수 있음.
## xticks은 x축에 대한 틱 설정하는 부분로서 라벨 및 기울림 그리고 좌우 정렬 (ha)을 할 수 있음.
## np.poly1d은 1차 선형 회귀곡선을 이용할 수 있고 np.poly2d는 2차 다항식을 의미함.
## p1.plot(x값, y값, ‘k-‘ (검정색 실선), ‘k—‘ (검정색 파선), linewidth=3)를 통해 그림 2개를 그려줌.
## subplots_adjust은 그림 간격을 조절할 수 있음.
## Python Plotting Beginners Guide.pdf 및 matplotlib gallery를 참조하면 바람 장미 등 많은 그래프를 그릴 수 있음.
basemap 설치 및 basemap을 이용한 지도 그림 그리기
-
basemaptutorial.pdf 및 https://basemaptutorial.readthedocs.io/en/latest/first_map.html을 참조하여 실습함
-
PuTTy 설치 및 이용 방법 (설치 파일: putty-64bit-0.70-installer)
## Etopo는 해양 기상청에서 만든 고해상도 DEM 자료로서 기상학에서는 잘 사용하지 않음.
## 지구 그리는 데 Mollweide projection (극지방이 조밀하여 보이지 않을 경우), Robinson, cylindrical, Equidistant (일반적으로 사용하는 도법). Lambert (WRF에서 쓰는 방법으로 등거리 간격이며 작은 영역 (동아시아)에 대한 유용한 도법), Orthographic (인공위성 도법), North Polar (극 중심 도법) 등이 있음.
llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat ## ROI 영역 설정함.
resolution ## h에서 c로 갈수록 저해상도임.
x, y = map(0, 0) ## 위경도 값에 해당하는 부분임.
map.plot(x, y, marker=’d’, color=’m’) ## 마젠타색으로 표시함.
## 래스터(raster) 데이터의 경우 .tiff을 그림의 값을 새로운 좌표계로 형성하는 방법임.
## linspace은 파이썬의 내장함수로서 10 개 간격으로 작성해줌.
## lons : -180~179, 1 (360 개) vector
## lats : -90~90, 1 (181 개) vector
## meshgrid은 2차원 격자를 형성해줌.
1 2 3 4 5
1 o o o o o
2 o o o o o
3 o o o o o
4 o o o o o
5 o o o o o
cs = map.contour(xx, yy, data, range(400, 1500, 100), cmap = plot.cm.cubehelix)
plot.clable( ) ## 유효숫자 설정 및 line 설정가능함.
hex ## 육각 격자로 표시함.
## alpha는 투명도를 설명함.
## text는 텍스트를 삽입할 수 있음.
## 기본적인 폰트 크기 및 폰트를 설정 가능할 뿐만 아니라 구글맵도 연동하여 표출할 수 있음.
## draw.Drawconuntries은 나라의 국경 표시할 수 있음.
## -180W~180E를 그릴 경우 -180 = 180이 동일한 값이기 때문에 addcyclic이 필요함.
## colormap에서 vmin, vmax은 최대/최소 color에 해당하는 부분이고 colormesh은 컬러 맵을 그리는 방법임.
gcpoints ## 지구는 한바퀴 도는 선을 그려주는 방법로서 구면좌표계에 대해 거리 측정함.
is_land ## 육해상 마스킹을 해줌.
maskoceans ## 해양에 대해서 마스크하는 방법임.
nightshade ## 시간에 대해 그릴 수 있으며 투명도 설정 가능함.
import matplotlib
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pylab as plt
# https://basemaptutorial.readthedocs.io/en/latest/first_map.html
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 12))
# define font size
plt.rc("font", size=22)
map = Basemap()
map.drawcoastlines()
plt.show()
plt.savefig('test.png')
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 12))
map = Basemap(projection='ortho',
lat_0=0, lon_0=140.7)
#Fill the globe with a blue color
map.drawmapboundary(fill_color='aqua')
#Fill the continents with the land color
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
plt.show()
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 12))
map = Basemap(projection='ortho',
lat_0=0, lon_0=140.7)
#Fill the globe with a blue color
map.drawmapboundary(fill_color='aqua')
#Fill the continents with the land color
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
plt.show()
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
# define plot size in inches (width,
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from osgeo import gdal
from numpy import linspace
from numpy import meshgrid
map = Basemap(projection='tmerc',
lat_0=0, lon_0=3,
llcrnrlon=1.819757266426611,
llcrnrlat=41.583851612359275,
urcrnrlon=1.841589961763497,
urcrnrlat=41.598674173123)
ds = gdal.Open("../sample_files/dem.tiff")
data = ds.ReadAsArray()
x = linspace(0, map.urcrnrx, data.shape[1])
y = linspace(0, map.urcrnry, data.shape[0])
xx, yy = meshgrid(x, y)
map.contourf(xx, yy, data)
plt.show()height) & resolution(DPI)
plt.figure(figsize=(12, 12))
map = Basemap(projection='ortho',
lat_0=0, lon_0=3, llcrnrlon=1.819757266426611,
llcrnrlat=41.583851612359275,
urcrnrlon=1.841589961763497,
urcrnrlat=41.598674173123)
#Fill the globe with a blue color
map.drawmapboundary(fill_color='aqua')
#Fill the continents with the land color
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
plt.show()
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from osgeo import gdal
from numpy import linspace
from numpy import meshgrid
map = Basemap(projection='tmerc',
lat_0=0, lon_0=3,
llcrnrlon=1.819757266426611,
llcrnrlat=41.583851612359275,
urcrnrlon=1.841589961763497,
urcrnrlat=41.598674173123)
ds = gdal.Open("../sample_files/dem.tiff")
data = ds.ReadAsArray()
x = linspace(0, map.urcrnrx, data.shape[1])
y = linspace(0, map.urcrnry, data.shape[0])
xx, yy = meshgrid(x, y)
map.contourf(xx, yy, data)
plt.show()
sys, os, subprocess, glob 모듈 소개
자동으로 프로그래밍할 경우 (shell 및 fortran 이용)
그러나 파이썬의 경우 모두 사용할 수 있음.
여러가지 일련의 과정을 파이썬 프로그래밍으로 이용할 수 있음.
#====================================================
# os
#====================================================
import os
## 리눅스 상에서는 mkdir –p class/math를 사용할 수 있으나 파이썬의 경우 os.path.join로 대체 가능함.
import glob ## *를 사용할 수 있음.
## CMIP5의 50개 모형 자료를 이용할 경우 일일히 자료를 불러오기 어렵기 때문에 glob를 사용하여 자동으로 불러냄. 이 경우 자동화되기 때문에 실수가 최소한 줄여짐.
## append는 추가하거나 index는 인덱스 찾는 명령어임.
## add 및 copy는 각각 리스트 추가하거나 복사하는 명령어임.
a = [1,2,3]
b = a
b.append(4)
import os
os.system(‘ls’)
os.system(‘date’)
from subprocess import call
call('ls')
if os.path.exist(*/dir2’):
pass
else:
os.mkdir(‘./dir2)
os.path.basenames ## 파일 경로 중에서 파일명만 알려줌.
#====================================================
# sys
#====================================================
## 화면에 입력한 값을 받아올 수 있음.
sys.path ## 경로 열기
sys.exit ## 중간에 프로그램 구동 후 나감
## CMIP 50개 모형을 평균할 경우 프로그램 시스템 부하 발생. 이 경우 check_all를 이용하여 메모리 부하 및 섞이는 것을 방지해줌.
## check_call만을 사용할 것을 추천함.
#====================================================
# ohc_ann1x1_basin.py
#====================================================
## basin (태평양, 대서양 등)별로 해양 깊이와 재현실험 (historical)을 통해 해양 열용량을 계산하는 프로그램.
## 적도에서 극으로 갈수록 면적이 작아지기 때문에 grid_area를 이용하여 격자마다 면적 계산함.
## 모든 모형 결과를 불러올 경우 flist.sort()하여 알파벳 순으로 가져오므로 순차적으로 open를 통해 자료를 읽을 수 있음.
## CMIP5 파일명은 Var_HadGEM2-AO-rlilpl_*이기 때문에 split를 이용하여 파일명을 추출할 수 있음.
## 코드 내에서 격자마다 육지 (50%) 및 해양 (50%)의 비율로 자료가 있을 경우만 사용함.
## easy_nc를 check_names를 이용하여 변환해줌.
## UV-CDAT는 window에 설치 가능하며 특히 기후 연구자에게 추천함.
#====================================================
# cmip5_regrid_clmon.py
#====================================================
## 수온, 염분 (기상적으로 기온, 기압)를 이용하는 프로그램임.
## regrid2 말고 cdo 패키지를 사용해도 무방함.
## 맵핑할때 matplotlib와 basemap를 이용할 수 있음.
#====================================================
# 실습 코드
#====================================================
import os
os.mkdir('mydir')
foldername = os.path.join('mydir', 'python')
os.makedirs(foldername)
origfolder = os.getcwd() # get name of current folder
os.chdir(foldername) # move ("change directory")
...
os.chdir(origfolder) # move back
!dir
import glob
filelist1 = glob.glob('*.py')
print(filelist1)
# os.getcwd()
# os.curdir
filelist1 = os.listdir('mydir')
print(filelist1)
dir(filelist1)
a = [1,2,3]
b = a
b.append(4)
print(b)
print(a)
import copy
a = [1,2,3]
b = copy.copy(a)
b.append(4)
print(b)
print(a)
alreverse()
a.sort()
os.path.split(os.getcwd())
import sys
dir(sys)
sys.version
print(sys.argv)
# x = raw_input()
def my_cal(x):
print(x**2)
my_cal(2)
from subprocess import call
subprocess.check_call(["ls", "-l"])
import urllib
from datetime import datetime, timedelta
import numpy as np
import os
#====================================================
# 기말고사 (시험 출제 범위)
#====================================================
Wikidocs.net 참조하여 자료 유형 (list, tuple, dictionary, string, set)
리스트로 arrey로 가능함. 튜플은 모형이나 값이 바뀌지 않음.
a = list(1,2,3)
b = tuple(a)
a.append(4)
b를 바꾸고 싶으면 b = list(b)
필요할때마다 서로 호환 가능함.
city = [‘강릉’, ‘서울’, ‘부산’]
temp = [24, 27, 29]
d = dict(zip(city, temp))
d = {‘강릉’, 24, ‘서울’, 27, ‘부산’, ‘29’}
pr : 1979-2000 (22)
tas : 1982-2000 (25)
공통되는 개수는 19개 이기 때문에 교집합을 구할 수 있음.
A = [1,2,3]
B = set([3,4,5])
C = a*b (교집합을 하면 구할 수 있음)
open
Read()
Readline()
write(“ %% 10.1f”, x)
cdms2, cdutil (시험 제외)
matlotlib, basemap (pdf)
os, subprocess, sys (pdf)
즉 시험범위는 다음과 같습니다.
1. 자료유형(string, list, tuple,dictionary,set) wikidocs참고
2. 파일 읽고 쓰기
3. matplotlib, basemap pdf 설명서 참고
4. os, subprocess, sys pdf 설명서 참고
제대로 실습하지 못했던, cdms2와 cdutil은 시험범위에 포함되지 않습니다.
과제물
강릉원주대 (Gangneung-Wonju National University, GWNU) 복사 관측소 (Radiation Observation Station)를 이용하여 자료 읽기 및 저장
-
해당 과제를 하기 위한 컴파일 및 실행 코드는 파이썬 (Python)으로 작성되었고 과학 계산을 위한 라이브러리는 pandas, 기본 문법을 이용하였습니다.
-
파이썬에서 자료 읽기 및 저장할 경우 라이브러리 또는 기본 문법을 사용할 수 있으며 이 과제물에서는 2 가지 방법을 모두 설명하겠습니다.
-
소스코드는 그림과 같이 단계별로 자료 처리 과정을 수행하며 상세 설명은 다음과 같습니다.
-
1 단계는 주 프로그램로부터 과학 계산에 필요한 라이브러리 읽기, CR1000_Table1.dat 파일을 읽고 해당 변수를 추출하여 메모리상에 저장합니다.
-
2 단계는 해당 데이터를 CSV 형식으로 저장합니다.
-
라이브러리 읽기
# Library
import pandas as pd
import numpy as np
import sys
import os
[pandas 라이브러리]
-
파일 설정 및 읽기
# File read
cr1000 = pd.read_table(os.getcwd()+'/CR1000_Table1.dat', sep=',', skiprows=[0, 2, 3])
-
데이터 정보 확인
## File info.
print(cr1000.info())
print(cr1000.head())
print(cr1000.tail())
# Gangneung-Wonju National University (GWNU) Radiation Observation Station (37.77 N, 128.86 E)
# Variable: Air temperature(Vaisala Inc.), Pressure(Vaisala Inc.), Direct solar radiation by the Pyrheliometer(Kipp & Zonen Inc.)
# Wind speed(Vaisala Inc.), Wind direction(Vaisala Inc.), Sun_Duration_sec
# Resolution: 1 min. Avg
-
변수 가져오기
# 1) Variable extraction
data = cr1000[ ['TIMESTAMP', 'AIRTEMP_Avg', 'Press_hpa_Avg', 'CHP1_Avg',
'NIP_Avg', 'Wind_Speed', 'Wind_Direction', 'Sun_Duration_sec'] ]
# 2) Variable extraction
# data = pd.concat([cr1000.TIMESTAMP, cr1000.AIRTEMP_Avg, cr1000.Press_hpa_Avg, cr1000.CHP1_Avg,
# cr1000.NIP_Avg, cr1000.Wind_Speed, cr1000.Wind_Direction, cr1000.Sun_Duration_sec],
# axis=1)
# cr1000.TIMESTAMP == cr1000['TIMESTAMP']
-
파일 저장
# File write
data.to_csv(os.getcwd()+"/GWNU_Radiation_Observation_Station_2015-12-18.OUT", index=None, na_rep="NaN", sep=" ")
[기본 문법]
-
읽기/저장 파일 설정
###############################################################################
# Basic Grammar: File read/write
###############################################################################
fopen = open(os.getcwd()+"/CR1000_Table1.dat", "r")
fout = open(os.getcwd()+"/GWNU_Radiation2_Observation_Station_2015-12-18.OUT", "w")
-
파일 출력
-
fopen.readline()를 통해 행마다 읽기 및 구분자 (,) 분할
-
출력 변수에 대한 열 번호 선택
-
for i in range(4):
line = fopen.readline().split(",")
if (i == 1) :
head = line
fout.write(" ".join(head))
# "TIMESTAMP" "RECORD" "AIRTEMP_Avg" "Press_hpa_Avg" "A_Avg" "B_Avg" "C_Avg" "CHP1_Avg" "NIP_Avg" "AWm_Avg" "BWm_Avg" "CWm_Avg"
# 0 1 2 3 4 5 6 7 8 9 10 11
# "DirWm_Avg" "NIPWn_Avg" "RH_Avg" "Wind_Speed" "Wind_Direction" "CSD3_Direct_wm2_Avg" "Sun_Duration_sec" "Sun_Duration_hr_day"
# 12 13 14 15 16 17 18 19head[0]
lines = fopen.readlines()
for i in lines:
line = i.split(",")
fout.write(line[0] + ' ' + line[2] + ' ' + line[3] + ' ' + line[7] +
line[8] + ' ' + line[15] + ' ' + line[16] + ' ' + line[18] + "\n")
-
파일 닫기
fopen.close()
fout.close()
1904-2016년 연평균 지상 관측 자료 처리 및 가시화
-
라이브러리 읽기
# Library
import pandas as pd
import numpy as np
import sys
import os
import matplotlib.pyplot as plt
import numpy as np
from dplython import *
-
파일 설정 및 읽기
# File read
data = pd.read_csv('1904-2016_Yearly_Mean_Groud_Obs.KMA', sep="\s+")
-
데이터 정보 확인
# File info.
print(data.info())
print(data.head())
print(data.tail())
# 시간: 1904-2016년 연평균 자료 (지상관측)
# 변수: 지점, 년, 기온, 기압, 상대습도, 풍속
# id year temp pre rh ws
# 지점: 강릉, 광주, 대구, 대전, 부산, 서울, 전주, 제주, 청주, 춘천, 원주, 대관령
# 105 156 143 133 159 108 146 184 131 101 114 100
# 출처: 기상청 국가기후데이터센터 (http://sts.kma.go.kr/jsp/home/contents/main/main.do)
# 지점마다 관측 기간이 다름
# 대관령: 1972-2016
# 춘천 : 1966-2016
# 강릉 : 1912-2016
# 서울 : 1908-2016
# 원주 : 1972-2016
# 청주 : 1979-2016
# 대구 : 1909-2016
# 전주 : 1919-2016
# 광주 : 1940-2016
# 제주 : 1924-2016
# 1979-2016년에 대해 분석을 수행함.
-
데이터 프레임을 이용한 L1 전처리 및 가시화
-
각 지점 (105, 108, 133, 143, 159)에 따른 가시화
-
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 6))
# define font size
plt.rc("font", size=18)
# style
plt.style.use('seaborn-darkgrid')
# create a color palette
palette = plt.get_cmap('Set2')
num = 0
for i in [105, 108, 133, 143, 159]:
num += 1
data_L2 = DplyFrame(data) >> sift(X.id == i)
plt.plot(data_L2.year, data_L2.temp, color=palette(num), linewidth=2, label=i)
plt.title("Time series of yearly mean temperature for the year of 1979-2016")
# plt.legend(loc = "upper left", numpoints = 1)
plt.legend(loc = "lower right", numpoints = 1)
plt.xlabel("Time [Year]")
plt.ylabel(u"Air Temperature [\u00B0C]")
plt.xlim(1980, 2015)
plt.ylim(10, 16)
plt.savefig("Yearly mean temperature.png")
plt.show()
지상 관측 자료 (아스키 파일)를 이용하여 NetCDF 변환한 후 시계열 그래프 그리기
-
해당 과제를 하기 위한 컴파일 및 실행 코드는 Python으로 작성되었고 과학 계산을 위한 라이브러리는 Numpy, pandas, matplotlib를 이용하였습니다.
-
소스코드는 그림과 같이 단계별로 자료 처리 과정을 수행하며 상세 설명은 다음과 같습니다.
-
1 단계는 주 프로그램 (csv2nc_kma_ann.py)로부터 아스키 형식의 입력 자료 경로를 설정하여 컴파일 및 실행을 하면 NetCDF 형식 (tas_1904-2016_ann.nc)으로 저장됩니다.
-
2 단계는 보조 프로그램 (time_series_ncfile.py)로부터 과학 계산에 필요한 라이브러리 선언, Yearly_Mean_Temperature_1904-2016.nc 파일을 읽고 해당 변수를 추출하여 메모리상에 저장합니다.
-
3 단계는 tas_qc 변수를 이용하여 시계열 그래프를 그려 이미지 파일 형식으로 저장합니다.
-
라이브러리 읽기
# Library
from netCDF4 import *
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pylab as plt
from netCDF4 import Dataset, num2date
import pandas
import numpy as np
-
NetCDF 파일 읽기
# File read
nc = NetCDFFile("tas_1904-2016_ann.nc")
print(nc)
-
변수 가져오기
-
시간 : time
-
지점 : station
-
원시 기온 : tas_raw
-
품질검사 후 기온 : tas_qc
-
위도 : xlat
-
경도 : xlon
-
고도 : xhgt
-
time = nc.variables["time"][:]
station = nc.variables["x"][:]
tas_raw = nc.variables["tas_raw"][:]
tas_qc = nc.variables["tas_qc"][:]
xlat = nc.variables["xlat"]
xlon = nc.variables["xlon"]
xhgt = nc.variables["xhgt"]
-
시계열 그래프 가시화 및 이미지 저장
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 6))
# define font size
plt.rc("font", size=18)
# style
plt.style.use('seaborn-darkgrid')
# create a color palette
palette = plt.get_cmap('Set2')
num = 0
station2 = np.array([105., 108., 133., 143., 159.])
station2_name = np.array(["Gangneung", "Seoul", "Daejeon", "Jeonju", "Busan"])
for i in range(0, 95):
if station[i] == station2[num] :
plt.plot(time[0:113]+1904, tas_raw[0:113,i], color=palette(num), linewidth=2, label=station2_name[num])
plt.title("Time series of Annually Mean Temperature for the Year of 1904-2016 \n")
# plt.legend(loc = "upper left",l numpoints = 1)
plt.legend(loc = "lower right", numpoints = 1)
plt.xlabel("Time [Year]")
plt.ylabel(u"Air Temperature [\u00B0C]")
plt.xlim(1900, 2020)
plt.ylim(9, 16)
plt.savefig("Yearly mean temperature2.png")
num = num + 1
plt.show()
GPCP 강우강도 자료를 이용하여 사막 영역을 마스킹하고 해당 영역에 대한 ECMWF 기온 표출
-
해당 과제를 하기 위한 컴파일 및 실행 코드는 Python으로 작성되었으며 과학 계산을 위한 라이브러리는 Basemap, numpy, matplotlib, netCDF4를 이용하였습니다.
-
소스 코드는 그림과 같이 단계별로 수행하며 상세 설명은 다음과 같습니다.
-
1 단계는 주 프로그램 (ERA_tas_gpcp_prc_mask.py)로부터 ECMWF 및 GPCP의 입력 자료 경로를 설정하여 메모리상에 저장하고 마스킹을 위하여 두 자료를 공간 일치시켜 사막 외 영역을 제거하였습니다.
-
이 과정에서 사막 영역은 연평균 강수량이 250 mm/year 이하로 정의하고 Netcdf 형식으로 저장하였습니다 (ERA_tas_mask.nc).
-
-
2 단계는 보조 프로그램 (mapping_ncfile.py)로부터 과학 계산에 필요한 라이브러리 읽기, ERA_tas_mask.nc 파일을 읽고 해당 변수를 추출하여 메모리상에 저장합니다.
-
3 단계는 위도 (lat), 경도 (lon), 기온 (val) 변수를 이용하여 영상 장면 표출을 하여 이미지 형식으로 저장하였습니다. 그러나 현재는 연평균 250 mm/year 이하인 육지 및 해상에 표출되기 때문에 추후 landsea 마스킹이 필요하다.
-
그리고 사막 영역을 마스킹한 자료뿐만 아니라 ECMWF를 이용한 연평균 기온 자료와 GPCP를 이용한 강우강도 자료를 표출하였다.
[GPCP 강우강도 자료를 이용하여 사막 영역 마스킹 후 ECMWF 기온 표출]
-
라이브러리 읽기
#=======================================================
# Library
#=======================================================
import cdms2, cdutil, MV2
import regrid2, vcs, os
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
import netCDF4
-
NetCDF 파일 읽기
#=======================================================
# Netcdf file read
#=======================================================
fn_temp = cdms2.open('tas_ERA40_2000.nc', 'r')
fn_prc = cdms2.open('gpcp.nc', 'r')
-
해당 변수 (기온, 강우강도) 추출하여 연평균 수행 및 요약 통계량 계산
temp = fn_temp('t2m', time = ('2000-1-1', '2000-12-31'))
mean_temp = MV2.average(temp, axis=0)
print(mean_temp.shape)
print(mean_temp.max())
print(mean_temp.min())
prc = fn_prc('precip', time = ('2000-1-1', '2000-12-31'))
mean_prc = MV2.average(prc, axis=0)*365 # mm/day * 365 = mm/year
print(mean_prc.shape)
print(mean_prc.max())
print(mean_prc.min())
-
연평균 기온 및 강수량은 공간 일치시켜 마스킹 수행
#=======================================================
# Agreement of space
#=======================================================
outgrid = mean_temp.getGrid()
mask_prc = mean_prc.regrid(outgrid)
-
연평균 강수강도가 250 mm/year 이하를 사막으로 정의
-
여기서 사막 영역일 경우 mask는 1이고 그렇지 않을 경우 0으로 메모리 상에 저장
-
#=======================================================
# Mask
#=======================================================
val = 250
mask_loc = MV2.masked_less(mask_prc, val)
mask = MV2.getmask(mask_loc)
-
NetCDF 파일 출력
#=======================================================
# Netcdf file
#=======================================================
value = 0
cdms2.setNetcdfShuffleFlag(value) ## where value is either 0 or 1
cdms2.setNetcdfDeflateFlag(value) ## where value is either 0 or 1
cdms2.setNetcdfDeflateLevelFlag(value) ## where value is a integer between 0 and 9 included
Fout = cdms2.open('ERA_tas_mask.nc', 'w')
Fout.write(mean_temp*mask, id='t2m')
#Fout = cdms2.open('ERA_tas.nc', 'w')
#Fout.write(mean_temp, id='t2m')
# Fout = cdms2.open('gpcp_prc.nc', 'w')
# Fout.write(mean_prc, id='precip')
Fout.close()
-
NetCDF 파일 읽기
nc = Dataset("INPUT/ERA_tas_mask.nc", "r")
print(nc)
-
변수 가져오기 및 요약 통계량 계산
-
위도 : lat
-
경도 : lon
-
연평균 기온 : t2m
-
lat = nc.variables["latitude"][:]
lon = nc.variables["longitude"][:]
val = nc.variables["t2m"][:]
print(lat.max(), lat.min())
print(lon.max(), lon.min())
print(val.max(), val.min())
-
사막 영역에 대해 연평균 기온 표출 및 이미지 저장
-
이 과정에서 연평균 250 mm/year 이하로 정의되어 육지 및 해상에서 표출되나 추후 육/해상 (Land/Sea) 마스킹이 필요
-
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 6))
# define font size
plt.rc("font", size=18)
# Plot the field using Basemap. Start with setting the map
# projection using the limits of the lat/lon data itself:
m=Basemap(projection='mill',lat_ts=0,llcrnrlon=lon.min(),
urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(),
resolution='c')
# convert the lat/lon values to x/y projections.
x, y = m(*np.meshgrid(lon,lat))
# plot the field using the fast pcolormesh routine
# set the colormap to jet.
m.pcolormesh(x,y,val,shading='flat',cmap=plt.cm.jet)
m.colorbar(location='right', label="Air Temperature [K]")
# Add a coastline and axis values.
m.drawcoastlines(color='white')
# m.drawlsmask(land_color='coral',ocean_color='aqua', lsmask=1)
m.drawlsmask(ocean_color='white', lsmask=False)
# m.drawcoastlines(color='white')
# m.fillcontinents(color='white') # only land
plt.clim(280, 310)
m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
# Add a colorbar and title, and then show the plot.
plt.title('Mapping of Annually Mean 2 meter Temperature using ECMWF \n')
plt.savefig("Mapping of Annually Mean 2 meter Temperature using ECMWF.png")
plt.show()
[GPCP 자료를 이용한 강우강도 표출]
-
GPCP NetCDF 파일 읽기
# nc = NetCDFFile("INPUT/2017-11-15/gpcp_prc.nc")
nc = Dataset("INPUT/2017-11-15/gpcp_prc.nc", "r")
print(nc)
-
변수 가져오기 및 요약 통계량 계산
lat = nc.variables["lat"][:]
lon = nc.variables["lon"][:]
val = nc.variables["precip"]
print(lat.max(), lat.min())
print(lon.max(), lon.min())
# print(val.max(), val.min())
-
GPCP의 연평균 강우강도 가시화 및 이미지 저장
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 6))
# define font size
plt.rc("font", size=18)
# Plot the field using Basemap. Start with setting the map
# projection using the limits of the lat/lon data itself:
# m=Basemap(projection='mill',lat_ts=0,llcrnrlon=lon.min(),
m=Basemap(projection='cyl',lat_ts=0,llcrnrlon=lon.min(),
urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(),
resolution='c')
# convert the lat/lon values to x/y projections.
x, y = m(*np.meshgrid(lon,lat))
# plot the field using the fast pcolormesh routine
# set the colormap to jet.
m.pcolormesh(x,y,val,shading='flat',cmap=plt.cm.jet)
m.colorbar(location='right', label="Precipitation Rate [mm/year]")
# Add a coastline and axis values.
m.drawcoastlines(color='white')
plt.clim(0, 3000)
# m.fillcontinents()
# m.drawmapboundary()
# m.drawlsmask(land_color='coral',ocean_color='aqua')
m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
# Add a colorbar and title, and then show the plot.
plt.title('Mapping of Annually Mean Precipitation Rate using GPCP \n')
plt.savefig("Mapping of Annually Mean Precipitation Rate using GPCP.png")
plt.show()
[ECMWF를 이용한 연평균 기온 표출]
-
ECMWF NetCDF 파일 읽기
nc = NetCDFFile("INPUT/2017-11-15/ERA_tas.nc")
print(nc)
-
변수 가져오기 및 요약 통계량 계산
lat = nc.variables["latitude"][:]
lon = nc.variables["longitude"][:]
val = nc.variables["t2m"]
print(val)
# print(lat.max(), lat.min())
# print(lon.max(), lon.min())
# print(val.max(), val.min())
-
ECMWF의 연평균 기온 표출 및 이미지 저장
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 6))
# define font size
plt.rc("font", size=18)
# Plot the field using Basemap. Start with setting the map
# projection using the limits of the lat/lon data itself:
m=Basemap(projection='mill',lat_ts=0,llcrnrlon=lon.min(),
urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(),
resolution='c')
# convert the lat/lon values to x/y projections.
x, y = m(*np.meshgrid(lon,lat))
# plot the field using the fast pcolormesh routine
# set the colormap to jet.
m.pcolormesh(x,y,val,shading='flat',cmap=plt.cm.jet)
m.colorbar(location='right', label="2 meter Temperature [K]")
# Add a coastline and axis values.
m.drawcoastlines(color='white')
plt.clim(220, 310)
# m.fillcontinents()
# m.drawmapboundary()
m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
# Add a colorbar and title, and then show the plot.
plt.title('Mapping of Annually Mean 2 meter Temperature using ECMWF \n')
plt.savefig("Mapping of Annually Mean 2 meter Temperature using ECMW.png")
plt.show()
히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES) 자료를 이용하여 지표면 및 대기상단에서의 단파복사 산출 및 비교 분석
-
해당 과제를 하기 위한 컴파일 및 실행 코드는 Python으로 작성되었으며 과학 계산을 위한 라이브러리는 numpy, pandas, matplotlib, Basemap, scipy (conda 제공) 그리고 dplython (conda 미제공)를 이용하였습니다.
-
소스코드는 그림과 같이 단계별로 자료 처리 수행하여 산점도 및 장면 분포 (Mapping)을 가시화하였습니다.
-
즉 1 단계는 주 프로그램 (ITM_ report4.ipynb)로부터 과학 계산에 필요한 라이브러리 읽고 2016년 10월 01일에 대해 히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES)를 시공간 일치시킨 파일 (Aqua_20161001.OUT)을 읽습니다.
-
2 단계는 대기상단에서의 광대역 알베도 (TOA Albedo) 및 상향단파복사 (RSR), 지표면에서의 투과율 (Transmittance) 및 하향단파복사 (DSR)의 변수에 대해 전처리 과정을 거쳐 메모리 상에 저장합니다.
-
3 단계는 대기상단에서의 상향단파복사 (RSR) 및 지표면에서의 하향단파복사 (DSR)을 이용하여 산점도와 장면 분포를 가시화하여 이미지 형식으로 저장합니다.
-
라이브러리 읽기
# Library
import pandas as pd
import numpy as np
import sys
import os
import matplotlib.pyplot as plt
from dplython import *
# (DplyFrame, X, diamonds, select, sift, sample_n,
# sample_frac, head, arrange, mutate, group_by, summarize, DelayFunction)
from scipy.stats import linregress
from matplotlib import pyplot as plt
from IPython.display import Image
from mpl_toolkits.basemap import Basemap
from matplotlib.colors import Normalize
import matplotlib
import matplotlib.cm as cm
import seaborn as sns
from scipy.stats import linregress
from matplotlib import rcParams
-
아스키 (ASCII) 파일 읽기
-
2016년 10월 01일에 히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES)와의 시/공간 일치된 파일 읽기
-
col_name = ["lon", "lat", "sza", "vza", "ga", "ceres_albedo", "ceres_rsr", "ceres_trans", "ceres_dsr",
"albedo", "rsr", "trans", "dsr", "ceres_landcover", "ceres_clear_fraction"]
data = pd.read_csv('INPUT/2017-12-02/Aqua_20161001.OUT', sep='\s+', header=None, names=col_name)
## longitude, Latitude, Solar zenith angle, Viewing zenith angle, Glint angle,
## CERES TOA albedo, CERES rsr,CERES transmittance, CERES DSR
## AHI TOA albedo, AHI rsr,AHI transmittance, AHI DSR
## Landcover, Clear fraction
data.head()
-
데이터 프레임를 이용한 L1 전처리
-
AHI와 CERES의 상향단파복사 (*_rsr), 하향단파복사 (*_dsr), 광대역 알베도 (*_albedo), 대기 투과율 (*_trans)의 물리적 관측 범위 설정
-
태양 천정각 (sza) 및 위성 천정각 (vza)이 증가할수록 길어지는 광학경로로 인해 오차가 발생하기 때문에 80 이상을 제외
-
data_L1 = (
DplyFrame(data)
>> sift((0 <= X.ceres_rsr) & (X.ceres_rsr <= 1400))
>> sift((0 <= X.ceres_albedo) & (X.ceres_albedo <= 1))
>> sift((0 <= X.ceres_dsr) & (X.ceres_dsr <= 1400))
>> sift((0 <= X.ceres_trans) & (X.ceres_trans <= 1))
>> sift((0 <= X.rsr) & (X.rsr <= 1400))
>> sift((0 <= X.albedo) & (X.albedo <= 1))
>> sift((0 <= X.dsr) & (X.dsr <= 1400))
>> sift((0 <= X.trans) & (X.trans <= 1))
>> sift((0 <= X.sza) & (X.sza <= 80))
>> sift((0 <= X.vza) & (X.vza <= 80))
)
data_L1.head()
-
산점도 가시화 및 이미지 저장
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 10))
# define font size
plt.rc("font", size=22)
# plt.rcParams["font.family"] = "Times New Roman"
rcParams['font.family'] = 'sans-serif'
# rcParams['font.family'] = 'New Century Schoolbook'
# style
plt.style.use('seaborn-darkgrid')
# x, y setting
X = data_L1.dsr
Y = data_L1.ceres_dsr
# Estimate the 2D histogram
nbins = 250
H, xedges, yedges = np.histogram2d(X, Y, bins=nbins)
# H needs to be rotated and flipped
H = np.rot90(H)
H = np.flipud(H)
# Mask zeros
Hmasked = np.ma.masked_where(H==0,H) # Mask pixels with a value of zero
plt.pcolormesh(xedges, yedges, Hmasked, cmap=cm.get_cmap('jet'), vmin=0, vmax=100)
plt.title("Retrieval of Downward Shortwave Radiation (DSR) \n at the Surface using Himawari-8 / AHI data\n")
plt.xlabel('Himawari-8 / AHI DSR $\mathregular{[Wm^{-2}]}$')
plt.ylabel('Aqua / CERES DSR $\mathregular{[Wm^{-2}]}$')
plt.xlim(0, 1400)
plt.ylim(0, 1400)
plt.grid()
cbar = plt.colorbar()
cbar.ax.set_ylabel('Count')
## Bias (relative Bias), RMSE (relative RMSE), R, slope, intercept, pvalue
Bias = np.mean(X-Y)
rBias = (Bias/np.mean(Y))*100.0
RMSE = np.sqrt( np.mean((X-Y)**2) )
rRMSE = (RMSE/np.mean(Y))*100.0
slope = linregress(X, Y)[0]
intercept = linregress(X, Y)[1]
R = linregress(X, Y)[2]
Pvalue = linregress(X, Y)[3]
N = len(X)
lmfit = (slope*X)+intercept
plt.plot(X, lmfit, color='red', linewidth=2)
plt.plot([0, 1400], [0, 1400], color='black', linewidth=2)
print(Bias, rBias, RMSE, rRMSE)
print(slope, intercept, R, Pvalue, N)
plt.annotate('CERES = %.2f x (AHI) + %.2f' %(slope, intercept), xy=(20, 1350), color='red', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
plt.annotate('R = %.2f (p-value < %.2f)' %(R, Pvalue), xy=(20, 1250), color='red', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
plt.annotate('Bias = %.2f (rBias = %.2f)' %(Bias, rBias), xy=(20, 1150), color='black', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
plt.annotate('RMSE = %.2f (rRMSE = %.2f)' %(RMSE, rRMSE), xy=(20, 1050), color='black', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
plt.annotate('N = %d' %N, xy=(20, 950), color='black', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
plt.savefig("FIG/Scatterplot_Himawari-8_AHI_DSR.png")
plt.show()
-
장면 분석 가시화 및 이미지 저장
%matplotlib inline
# define plot size in inches (width, height) & resolution(DPI)
plt.figure(figsize=(12, 10))
# style
plt.style.use('seaborn-darkgrid')
# define font size
plt.rc("font", size=22)
# plt.rcParams["font.family"] = "Times New Roman"
rcParams['font.family'] = 'sans-serif'
# rcParams['font.family'] = 'New Century Schoolbook'
m = Basemap(projection='ortho', lon_0=140.714793, lat_0=-0.007606, resolution='c')
# c (crude) < l (low) < i (intermediate) < h (high) < f (full)
# Source: http://seesaawiki.jp/met-python/d/Basemap
x,y=m(data.lon.values, data.lat.values)
val = data.dsr.values
m.scatter(x, y, c=val, s=1.0, marker="s", zorder=1, vmin=0, vmax=1200, cmap=plt.cm.get_cmap('rainbow'), alpha=1.0)
plt.colorbar(label=r'Downward Shortwave Radiation (DSR) [Wm$^{-2}$]')
m.drawcoastlines()
m.drawcountries()
m.drawmapboundary(fill_color='white')
m.drawparallels(np.arange(-60.,61.,30.),labels=[1,0,0,0],dashes=[2,2])
m.drawmeridians(np.arange(-160.,200.,30.),labels=[0,0,0,1],dashes=[2,2])
plt.title('DSR using Himawari-8/AHI on the 1 October, 2016 \n')
plt.annotate(u'60\N{DEGREE SIGN}S', xy=(m(170, -62.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'30\N{DEGREE SIGN}S', xy=(m(170, -32.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'30\N{DEGREE SIGN}N', xy=(m(170, +27.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'60\N{DEGREE SIGN}N', xy=(m(170, +57.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'80\N{DEGREE SIGN}E', xy=(m(80, -2.5)) , color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'110\N{DEGREE SIGN}E', xy=(m(110, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'110\N{DEGREE SIGN}E', xy=(m(110, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'140\N{DEGREE SIGN}E', xy=(m(140, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'170\N{DEGREE SIGN}E', xy=(m(170, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.annotate(u'160\N{DEGREE SIGN}W', xy=(m(-160, -2.5)),color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
plt.savefig("FIG/Scane_analysis_Himawari-8_AHI_DSR.png")
plt.show()
-
대기 상단에서의 상향단파복사 (RSR)
-
지표면에서의 하향단파복사 (DSR)
소스 코드
-
추후에 링크 형식으로 추가 예정
관련 자료
-
지상 관측 자료 (아스키 파일)를 이용하여 NetCDF 변환한 후 시계열 그래프 그리기 그리고 GPCP 강우강도 자료를 이용하여 사막 영역을 마스킹하고 해당 영역에 대한 ECMWF 기온 표출
-
히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES) 자료를 이용하여 지표면 및 대기상단에서의 단파복사 산출 및 비교 분석
참고 문헌
[논문]
- 없음
[보고서]
- 없음
[URL]
- 없음
문의사항
[기상학/프로그래밍 언어]
- sangho.lee.1990@gmail.com
[해양학/천문학/빅데이터]
- saimang0804@gmail.com
'자기계발 > 강릉원주대 대기환경과학과' 카테고리의 다른 글
[강릉원주대 대기환경과학과] 2015년 1학기 심교 식품과화학물질 과제물 (1) | 2023.01.05 |
---|---|
[강릉원주대 대기환경과학과] 2014년 겨울학기 일교 인간과환경 과제물 (0) | 2023.01.04 |
[강릉원주대 대기환경과학과] 2017년 1학기 전선 역해석 방법 과제물 (2) (0) | 2020.03.19 |
[강릉원주대 대기환경과학과] 2017년 1학기 전선 역해석 방법 과제물 (1) (0) | 2020.03.18 |
[강릉원주대 대기환경과학과] 2016년 2학기 전선 자료분석과 가시화 과제물 (0) | 2020.03.18 |
최근댓글