NASA의 OMNI 데이터는 태양풍과 지구 자기권 정보를 분석할 수 있는 중요한 데이터셋이다. 연구나 프로젝트에서 이 데이터를 python을 사용해 자동으로 다운로드하고 처리하는 방법을 정리하려고 한다.
OMNI 데이터는 태양풍과 지구 자기권 환경 데이터를 통합적으로 제공하는 데이터셋이다. L1 포인트의 위성 데이터를 지구 근처(정확히는 bow shock nose)로 time shift하여 제공하며, 시간 해상도는 1분, 5분, 1시간 등이 있어서 연구 목적에 따라 다양한 해상도를 선택할 수 있다. NASA의 OMNIWeb (https://omniweb.gsfc.nasa.gov/) 에서 데이터를 수동으로 다운로드할 수 있지만, python으로 자동화하면 데이터를 효율적으로 이용할 수 있다.
OMNI 데이터를 python으로 다운로드하려면 HTTP 요청 라이브러리인 requests를 사용한다. 아래는 5분 단위 데이터를 다운로드하는 기본 코드이다.
코드: 데이터 요청
import requests
from io import StringIO
def download_omni_data(start_date, end_date, resolution='5min'):
url = "https://omniweb.gsfc.nasa.gov/cgi/nx1.cgi"
payload = {
'activity': 'retrieve',
'res': resolution,
'spacecraft': 'omni_min',
'start_date': start_date,
'end_date': end_date,
'vars': ["21"]
}
response = requests.post(url, data=payload)
if response.status_code == 200:
print("데이터 요청 성공")
return response.txt
else:
raise Exception(f"데이터 요청 실패: {response.status_code}")
# 사용 예시
start_date = "202401010000"
end_date = "202401052359"
raw_data = download_omni_data(start_date, end_date)
contents = StringIO(raw_data).readlines()
activity : 데이터를 요청하는 작업 유형, 항상 'retrieve' 로 설정한다. (OMNIWeb API에서는 'retrieve'만 유효한 activity 값으로 알려져 있음)'retrieve': 데이터 검색(데이터를 가져오는 작업) 의미res : 시간 해상도 설정'1min': 1분 단위 데이터'5min': 5분 단위 데이터'hour': 1시간 단위 데이터'day': 1일 단위 데이터spacecraft: 데이터의 출처 지정'omni': 1시간 단위 OMNI 데이터셋'omni_min': 1분 또는 5분 단위 고해상도 OMNI 데이터셋vars: 요청할 변수 목록 - 사이트에서 3: Description of records and words 참조 (https://omniweb.gsfc.nasa.gov/html/ow_data.html). * 지정할 때에는 python에서 리스트 인덱스를 참조하는 것처럼 0부터 시작requests.postresponse). 상태 코드(response.status_code)와 데이터 내용(response.text)을 확인할 수 있다.StringIOStringIO를 사용해 메모리 내에서 파일처럼 변환한다.