ETCCDI Climate Change Indice ๋ถ์
๐จโ๐ป ETCCDI Climate Change Indice ์ ๋ฆฌ
1. ETCCDI
โExpert Team on Climate Change Detection and Indicesโ์ ์ฝ์ด๋ก, ๊ธฐํ ๋ณํ ๊ฐ์ง ๋ฐ ์งํ์ ๊ดํ ์ ๋ฌธ ํ. ETCCDI๋ ์ธ๊ณ ๊ธฐ์ ๊ธฐ๊ตฌ(WMO)์ ์ธ๊ณ ๊ธฐํ ์ฐ๊ตฌ ํ๋ก๊ทธ๋จ(WCRP)์ ์ผํ์ผ๋ก ํ๋ํ๋ ๊ตญ์ ์ ์ธ ์ฐ๊ตฌ ๊ทธ๋ฃน์
2. ETCCDI Climate Change Indice
CCl/CLIVAR Working Group (WG)๋ ETCCDI Climate Change Indice์ ๋ํ 40๊ฐ์ ์ง์๋ฅผ ์น์ธํ์๋ค
์ดํ The joint CCl/CLIVAR/JCOMM Expert Team์ด ๊ทน์น์ฌ์์ ์ ๋ํ ํ๊ธฐ์ํด โGuidelines on Analysis of extremes in a changing climate in support of informed decisions for adaptation, 2009โ๋ฅผ ์ ์, ๊ฐ์ฐ์ ๊ธฐ์จ์ ๊ดํ์ฌ ๊ฐ๊ฐ 11๊ฐ, 16๊ฐ๋ก ๊ตฌ์ฑ๋ 27๊ฐ์ ์ง์๋ฅผ ์ ์ํ์๋ค. ์ง์์ ๋ํ ์์ธํ ์ค๋ช ์ ETCCDI ๋ฉ๋ด์ผ์ ์ฐธ๊ณ ํ๋ค.
3. ETCCDI Climate Change Indice์ ๋์ ํ์์ฑ
๊ธฐํ ๋ณํ๋ ๊ธฐํ์ ํ๊ท ๊ฐ, ๋ณ๋์ฑ, ๊ทน๊ฐ, ๊ธฐํ ์ฌ๊ฑด์ ๋น๋ ๋ฐ ๊ฐ๋ ๋ฑ์ ์ํฅ์ ๋ฏธ์น๋ค. ์ด๋ฌํ ๊ธฐํ ๋ณํ์ ์ํฅ์ ํ๊ฐํ๊ธฐ ์ํด์๋ ๊ธฐํ ๋ณํ์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ์ ์ ๋ํ ํ ์ ์๋ ์งํ๊ฐ ํ์ํ๋ค. ์ด๋ฌํ ์งํ๋ฅผ ETCCDI Climate Change Indice๋ผ๊ณ ํ๋ค.
4. ETCCDI Climate Change Indice์ ์ข ๋ฅ
๋ฉ๋ด์ผ์ APPENDIX A: List of ETCCDMI core Climate Indices
์ ๋ฐ๋ฅธ๋ค
ID | Indicator name | Definitions | UNITS |
---|---|---|---|
FD0 | Frost days | Annual count when TN(daily minimum)<0ยบC | Days |
SU25 | Summer days | Annual count when TX(daily maximum)>25ยบC | Days |
ID0 | Ice days | Annual count when TX(daily maximum)<0ยบC | Days |
TR20 | Tropical nights | Annual count when TN(daily minimum)>20ยบC | Days |
GSL | Growing season Length | Annual (1st Jan to 31st Dec in NH, 1st July to 30th June in SH) count between first span of at least 6 days with TG>5ยบC and first span after July 1 (January 1 in SH) of 6 days with TG<5ยบC | Days |
TXx | Max Tmax | Monthly maximum value of daily maximum temp | ยบC |
TNx | Max Tmin | Monthly maximum value of daily minimum temp | ยบC |
TXn | Min Tmax | Monthly minimum value of daily maximum temp | ยบC |
TNn | Min Tmin | Monthly minimum value of daily minimum temp | ยบC |
TN10p | Cool nights | Percentage of days when TN<10th percentile | Days |
TX10p | Cool days | Percentage of days when TX<10th percentile | Days |
TN90p | Warm nights | Percentage of days when TN>90th percentile | Days |
TX90p | Warm days | Percentage of days when TX>90th percentile | Days |
WSDI | Warm spell duration indicator | Annual count of days with at least 6 consecutive days when TX>90th percentile | Days |
CSDI | Cold spell duration indicator | Annual count of days with at least 6 consecutive days when TN<10th percentile | Days |
DTR | Diurnal temperature range | Monthly mean difference between TX and TN | ยบC |
RX1day | Max 1-day precipitation amount | Monthly maximum 1-day precipitation | Mm |
Rx5day | Max 5-day precipitation amount | Monthly maximum consecutive 5-day precipitation | Mm |
SDII | Simple daily intensity index | Annual total precipitation divided by the number of wet days (defined as PRCP>=1.0mm) in the year | Mm/day |
R10 | Number of heavy precipitation days | Annual count of days when PRCP>=10mm | Days |
R20 | Number of very heavy precipitation days | Annual count of days when PRCP>=20mm | Days |
Rnn | Number of days above nn mm | Annual count of days when PRCP>=nn mm, nn is user defined threshold | Days |
CDD | Consecutive dry days | Maximum number of consecutive days with RR<1mm | Days |
CWD | Consecutive wet days | Maximum number of consecutive days with RR>=1mm | Days |
R95p | Very wet days | Annual total PRCP when RR>95th percentile | Mm |
R99p | Extremely wet days | Annual total PRCP when RR>99th percentile | mm |
PRCPTOT | Annual total wet-day precipitation | Annual total PRCP in wet days (RR>=1mm) | mm |
5. RClimDex๋ฅผ ์ฌ์ฉํ ETCCDI Climate Change Indice์ ๊ณ์ฐ ๋ฐฉ๋ฒ
5.1. RClimDex
-
RClimDex๋ R์ ์ด์ฉํ ETCCDI Climate Change Indice ๊ณ์ฐ ํจํค์ง์ด๋ค. RClimDex๋ ๊ธฐํ ๋ณํ ์งํ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํ R ํจํค์ง๋ก, ๊ธฐํ ๋ณํ ์งํ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํ R ํจ์๋ฅผ ์ ๊ณตํ๋ค. RClimDex
-
Python์์ RClimDex๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ด์๋ฒ์ ์ธ pyclimdex๋ฅผ ์ฌ์ฉํ๋ค. pyclimdex๋ RClimDex์ R ํจ์๋ฅผ Python์ผ๋ก ํฌํ ํ ๊ฒ์ด๋ค. pyclimdex
5.2. ์ ๋ ฅ ๋ฐ์ดํฐ ํ์
-
์ ๋ ฅ๋ฐ์ดํฐ์ ํ์์ ๋ฉ๋ด์ผ์
APPENDIX B: Input Data Format
์ ๋ฐ๋ฅธ๋ค. -
์ฝ๊ฑฐ๋ ์ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ์ ๋ชฉ๋ก ํ์์ ๋๋ค. ๋จ, โํ์ง ๊ด๋ฆฌโ ๋จ๊ณ์์ ์ฒ๋ฆฌ๋๋ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ ํ์ผ์ ์์ธ์ ๋๋ค. ์ด ์ ๋ ฅ ๋ฐ์ดํฐ ํ์ผ์๋ ๋ช ๊ฐ์ง ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค:
- ASCII ํ ์คํธ ํ์ผ
- ๋ค์ ์์์ ์ด: ์ฐ๋, ์, ์ผ, PRCP, TMAX, TMIN. (์ฐธ๊ณ : PRCP ๋จ์ = ๋ฐ๋ฆฌ๋ฏธํฐ, ์จ๋ ๋จ์ = ์ญ์จ).
- ์์ ์ค๋ช ๋ ํ์์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด์ผ ํฉ๋๋ค(์: ๊ฐ ์์๋ ํ๋ ์ด์์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ).
- ๋ฐ์ดํฐ ๊ธฐ๋ก์ ๊ฒฝ์ฐ ๋๋ฝ๋ ๋ฐ์ดํฐ๋ -99.9๋ก ์ฝ๋ฉํด์ผ ํ๋ฉฐ, ๋ฐ์ดํฐ ๊ธฐ๋ก์ ๋ฌ๋ ฅ ๋ ์ง ์์ด์ด์ผ ํฉ๋๋ค. ๋๋ฝ๋ ๋ ์ง๋ ํ์ฉ๋ฉ๋๋ค.
- ์์
1915 01 01 0.0000 -1.1095 -10.4922
1915 01 02 0.0306 -2.5678 -11.8757
1915 01 03 0.0000 -5.6643 -13.6188
6. RClimDex๋ฅผ ์ฌ์ฉํ ETCCDI Climate Change Indice ๊ณ์ฐ
6.1. ๋ถ์๋์ ์ง์ญ ์ค์
- ๊ธฐํ๋ณํ์์์ด ๊ทนํ์ง์๋ ๋์ ์ ํฐ ์ํฅ์ ๋ผ์น ๊ฒ์ผ๋ก ์ฌ๋ฃ๋๋ค. ๋ฐ๋ผ์ ๋์ ์์ฐ๋์ด ๋์ ์ง์ญ์ธ ๊ฒฝ์๋๋ฅผ ๋ถ์๋์ ์ง์ญ์ผ๋ก ์ค์ ํ๋ค.
6.2. ๋ถ์๋์ ๊ธฐ๊ฐ ์ค์
- 1990๋ ๋ถํฐ 2020๋ ๊น์ง์ ๊ธฐ๊ฐ์ ๋ถ์๋์ ๊ธฐ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
6.3. ๋ฐ์ดํฐ ๊ตฌ์ถ
- ๊ธฐ์๋ฐ์ดํฐ๋ ASOS๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค. ASOS๋ฐ์ดํฐ๋ ๊ธฐ์์ฒญ์์ ์ ๊ณตํ๋ ๊ณต๊ณต๋ฐ์ดํฐ์ด๋ค. Link
- asos ๋ฐ์ดํฐ๋ 10๋ ๊ฐ ์ผ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค. ๋ฐ๋ผ์ 1990๋ ๋ถํฐ 2020๋ ๊น์ง์ 30๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ 3๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ฐ์์ผ ํ๋ค.
- ๋ฐ์ดํฐ๋ค์ ๋จ์ผ ํด๋์ ์ ์ฅํ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ค. ๋จ ํด๋๋ด ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ์ธ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์์ด์ผ ํ๋ค.(glob โ*.csvโ ํจํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ)
import pandas as pd
import glob
#set options
startDate = '1990-01-01'
endDate = '2019-12-31'
if __name__ == '__main__':
# load data
dataList = [pd.read_csv(data,encoding='euc-kr') for data in glob.glob('*.csv')]
dataSet = pd.concat(dataList, axis=0, ignore_index=True)
#preprocessing
dataSet[ '์ผ๊ฐ์๋(mm)'].fillna(0, inplace=True)
for col in ['์ต์ ๊ธฐ์จ(ยฐC)', '์ต๊ณ ๊ธฐ์จ(ยฐC)', '์ผ๊ฐ์๋(mm)']:
dataSet[col].fillna(method='bfill', inplace=True)
print('NaN ๊ฐ ๊ฐ์: ', dataSet.isna().sum().sum())
dataSet.drop_duplicates(inplace=True,subset=['์ง์ ','์ง์ ๋ช
','์ผ์'])
dataSet['์ผ์']=pd.to_datetime(dataSet['์ผ์'])
dataSet['Y'] = dataSet['์ผ์'].dt.year
dataSet['M'] = dataSet['์ผ์'].dt.month.astype(str).apply(lambda x: x.zfill(2))
dataSet['D'] = dataSet['์ผ์'].dt.day.astype(str).apply(lambda x: x.zfill(2))
dataSet['StaID']=dataSet['์ง์ '].astype(str)+dataSet['์ง์ ๋ช
']
dataSet.sort_values(by=['์ผ์'], inplace=True)
dataSet = dataSet[(dataSet['์ผ์'] >= startDate) & (dataSet['์ผ์'] <= endDate)]
dataSet.drop(['์ง์ ', '์ง์ ๋ช
', '์ผ์'], axis=1, inplace=True)
dataSet=dataSet[['StaID','Y','M','D','์ผ๊ฐ์๋(mm)','์ต๊ณ ๊ธฐ์จ(ยฐC)','์ต์ ๊ธฐ์จ(ยฐC)']]
print('์ถ๋ ฅ๋ฐ์ดํฐ ํ์\n', dataSet.iloc[0])
#save with station ID
for station in dataSet['StaID'].unique():
#get standard dev for ๊ธฐ์จ
tempDev=max([dataSet.loc[dataSet['StaID']==station, '์ต๊ณ ๊ธฐ์จ(ยฐC)'].std(), dataSet.loc[dataSet['StaID']==station, '์ต์ ๊ธฐ์จ(ยฐC)'].std()])
#get max prcp
prcpMax=dataSet.loc[dataSet['StaID']==station, '์ผ๊ฐ์๋(mm)'].max()
dataSet[dataSet['StaID']==station].drop(['StaID'], axis=1).to_csv(f'{station}_pM{prcpMax}_tD{tempDev}.csv', index=False)
print(f'{station}.txt saved')
6.4. RClimDex ์คํ ๋ฐ ๋ถ์
๊ฐ์ฐ์งํ
-
RX1/RX5: ์ธ๋ฆ์ง์ญ ๋ฐ ๊ฑฐ์ฐฝ๊ณผ ํจ์๋ถ๊ทผ์์ SLOPE์ ์์น์ด ํ์ธ๋จ, ๋ด๋ฅ์ง์ญ์์ ์ฝํ ์์น์ ๋ณด์.
-
R10/R20: ์ธ๋ฆ์ง์ญ์์ SLOPE๊ฐ ์์นํ๋ฉฐ ๋ด๋ฅ์ง์ญ์์๋ SLOPE์ ํฐ ๋ณํ๊ฐ ์๊ฑฐ๋ ์ฝํ ํ๋ฝ์ ๋ณด์.
-
PRCPTOT: ๋ด๋ฅ์ง์ญ์์์ SLOPE๋ ๋์ฒด์ ์ผ๋ก ํ๊ฐํ๋ ์ํฉ์ผ๋ก ๊ฐ์ฐ ์ด๋์ ๊ฐ์๊ฐ ์์์ ์ ์ ์์. ์ธ๋ฆ์ง์ญ๊ณผ ํด์์ง์ญ์ ๊ฒฝ์ฐ SLOPE๊ฐ ์์นํ์ฌ ๋ณํํ๋ ํด์ ๊ธฐํ๊ฐ ๊ฐ์ฐ๋์ ๋์์์ ์ ์ถ ํ ์ ์์.
-
์ ์ฒด์ ์ผ๋ก ์ถ์ธ์ ์ 1990๋ ๋ถํฐ 2005๋ ๊น์ง ์์น์ธ๋ฅผ ๋ณด์์ผ๋ฉฐ ์ดํ ๊ฐ์ํ๋ ์์์ ๋ณด์, ์๊ฐ ๊ฐ์ฐ์ ์ต๋ ๊ฐ์ ์์นํ๋ ์ฐ๊ฐ ๋ด๋ฅ ์ง์ญ ๊ฐ์ฐ๋์ ๊ฐ์ํ๋ฉฐ ์ธ๋ฆ ๋ฐ ํด์์ง์ญ์์ ๊ฐ์ฐ๋SLOPE๋ ์์นํจ.
์จ๋์งํ
-
FD0: ์ธ์ง ์ง์ญ์ ์ ์ธํ ๋๋ถ๋ถ์ ์ง์ญ์์ SLOPE๊ฐ ํ๋ฝ์ธ๋ฅผ ๋ณด์.
-
SU25: ๋ชจ๋ ์ง์ญ์์ SLOPE๊ฐ ์์นํ๋ฉฐ ์๋์ง์ญ์์ SLOPE์ ์์น์ด ๊ฐ์ฅ ํผ.
-
TXx: ๋ชจ๋ ์ง์ญ์์ SLOPE๊ฐ ์ฝ๊ฐ ์์นํ๋ฉฐ ์๋์ง์ญ์์ SLOPE์ ์์น์ด ๊ฐ์ฅ ํผ.
-
TNn: ๊ฑฐ์ ๋์ผํ ๋น์จ๋ก ๊ฐ์ํ๋ ์ง์ญ๊ณผ ์์นํ๋ ์ง์ญ์ด ์์ผ๋. ์ต๋ SLOPE์ ๋ณํ์จ์ ๋์ฒด๋ก ์์นํจ(๊น์ฒ).
-
์ ์ฒด์ ์ผ๋ก ์ถ์ธ์ ์ 0๋ ์ดํ ์จ๋ ์งํ์ธ FD0๋ฅผ ์ ์ธํ๊ณ ์์น์ ๋ณด์ด๊ณ ์์์ผ๋ก ๊ธฐํ๋ณํ๋ก ์ธํ ์จ๋์ ์ ๋ฐ์ ์ธ ์์น์ด ์์์ ์ ์ถ ๊ฐ๋ฅํจ. ํด์์ง์ญ์์๋ ์๋๊ณผ ์ธ์ง, ๋ด๋ฅ์ง์ญ์์๋ ์์ฃผ์ ๊น์ฒ์ง์ญ์์ ๊ทธ ๋ณํ์จ์ด ํฌ๋ค๋๊ฒ์ ํ์ธ ํ ์ ์์.
๋๊ธ๋จ๊ธฐ๊ธฐ