본문 바로가기
수치모델 관련/COAWST

Python API 기반 GDAS-FNL 데이터(d083003) 다운로드 하기(@ncar-rda) (1/2)

by 광원다이노스 2025. 1. 3.

1. 개요

GDAS/FNL(Global Data Assimilation System/Final Analysis) 자료는 NCEP에서 제공하는 0.25도 해상도의 전지구 재분석 자료이다. 이 포스팅에서는 RDA UCAR 서버에서 Python을 이용하여 자료를 다운로드하는 방법을 설명한다.

 

2. 준비사항

2.1 주요 특징

  • 자동 재시도 : 다운로드 실패 시 최대 3회 재시도, 재시도 간 5초 대기
  • 진행률 표시 : tqdm 라이브러리를 이용한 진행바 표시, 다운로드 속도와 남은 시간 정보 제공
  • 중복 다운로드 방지 : 이미 존재하는 파일은 다운로드 건너뛰기, 불완전한 다운로드 파일 검사

 

2.2 주의사항

  • RDA UCAR 계정 설정 : 계정이 없으면 다운로드 불가, 데이터셋 d083003에 대한 접근 권한 필요
  • 데이터 용량 고려 : 0.25도 해상도의 전지구 자료, 하루 4개 파일 (6시간 간격)

 

2.3 필요한 라이브러리

import requests
from datetime import datetime, timedelta
from dateutil.rrule import rrule, HOURLY
import os, time
from tqdm import tqdm

 

3. 데이터셋 정보

dataset = 'd083003'  # GDAS/FNL 0.25도 자료
dspath = f'https://data.rda.ucar.edu/{dataset}/'

# 파일명 형식
# gdas1.fnl0p25.YYYYMMDDHH.fFF.grib2
# - YYYY: 년
# - MM: 월
# - DD: 일
# - HH: 시간 (00, 06, 12, 18)
# - FF: 예측 시간 (00, 06)

 

4. 다운로드 구현 방법

4.1 다운로드 함수 설명

def get_FNL_GDAS_from_rda_ucar_ds083_3(self):
    """
    지정된 기간의 GDAS/FNL 자료를 다운로드
    - 실제 기간 전후로 12시간 추가하여 다운로드
    - 6시간 간격의 자료
    - 진행률 표시 기능 포함
    """

 

4.2 파일 리스트 생성

# 다운로드 기간 설정 (전후 12시간 추가)
start_date = self.start_date_total - timedelta(hours=12)
end_date = self.end_date_total + timedelta(hours=12)

# 파일 리스트 생성
filelist = []
for dt in rrule(HOURLY, interval=interval, dtstart=start_date, until=end_date):
    for t_step in [0, 6]:
        filelist.append('{:}/{:}/gdas1.fnl0p25.{:}.f{:02d}.grib2'.format(
            dt.year, dt.strftime('%Y%m'), dt.strftime('%Y%m%d%H'), t_step))

 

4.3 파일 다운로드 함수

재시도 및 진행률 표시 기능이 포함된 다운로드 함수

def download_file(url, local_filename, max_retries=3, delay=5):
    """
    Parameters:
    -----------
    url: 다운로드할 파일의 URL
    local_filename: 저장할 로컬 파일 경로
    max_retries: 최대 재시도 횟수 (기본값: 3)
    delay: 재시도 전 대기 시간(초) (기본값: 5)
    """
    for attempt in range(max_retries):
        try:
            with requests.get(url, stream=True, timeout=30) as r:
                # 진행률 표시와 함께 다운로드
                total_size = int(r.headers.get('content-length', 0))
                block_size = 1024
                with open(local_filename, 'wb') as f, tqdm(
                    desc=os.path.basename(local_filename),
                    total=total_size,
                    unit='iB',
                    unit_scale=True
                ) as progress_bar:
                    for data in r.iter_content(block_size):
                        size = f.write(data)
                        progress_bar.update(size)
            return True
        except:
            if attempt < max_retries - 1:
                print(f"{delay}초 후 재시도...")
                time.sleep(delay)
    return False

 

5. 실행 방법

class case_info:
    def __init__(self):
        # 다운로드 기간 설정
        self.start_date_total = datetime(2023, 9, 1)
        self.end_date_total = datetime(2023, 9, 30)
        
        # 시간 간격 (시간)
        self.interval_gdas = 6
        
        # 저장 경로
        self.prefix_gdas = "./GDAS/"

if __name__ == "__main__":
    my = case_info()
    get_FNL_GDAS_from_rda_ucar_ds083_3(my)

 

[전체 코드 첨부]