본문 바로가기
자료분석 및 코딩/파이썬

[파이썬] 해양수치모델 시간 형식 변환. GMT, UTC, KST, 그리니치, 줄리안 데이 변환

by 아다콘다 2023. 6. 30.

 이번에는 수치모델의 시간 형식에 대해 다뤄보도록 하겠다. 여기서 필요한 개념은 줄리안데이(julian day, 율리우스일)와 표준시, 그리고 파이썬의 datetime 라이브러리이다.

 

1. 줄리안데이 (julian day, 율리우스일)

특정시각을 기준일로부터 시간(일,시,분,초 등) 단위로 계산한 값

 줄리안데이란 특정 시점을 나타내기 위해 기준일로부터 매일 1일씩 더하여 나타낸 값(기준일로부터의 일수)이다. 정확한 정의는 율리우스력 BC 4713년 1월 1일부터의 일수인데, 보통 특정 시각을 일수로 표현할 때 줄리안 데이를 쓴다고 표현한다. 예를 들어, 2000년 1월 1일 기준으로 잡고, 1월 5일을 줄리안데이로 나타내면 5개 되며, 1월 5일 12시는 5.5가 된다.

 수치모델에서는 이런 줄리안데이 개념으로 시간을 표현하는데 일수로 표현하기도 하고 시간, 분, 초 등으로 나타내기도 하며 기준일도 각 모델마다 상이하다. NetCDF 형식의 수치모델들은 보통 속성정보(attributes)에 이러한 정보를 포함하고 있는데 자료를 분석하기 전에 이를 반드시 확인해야 한다. 아래 시간 정보를 나타내는 예시를 나타내었다.

수치모델의 시간 속성 정보
수치모델의 시간 속성 정보

 

 

 이전 글에서 읽은 nc파일의 시간 정보를 보면(아래사진), 2000년 1월 1일을 기준으로 그 이후의 시간(hours)으로 시간값을 나타냈다고 표기되어 있다. 해당 값은 172632인데, 이는 2000년 1월 1일 이후로 172632시간이 지난 시점이라는 의미이다. 이를 계산해보겠다.

  • 172,632시간 = 7,193일 (172632 / 24시간)
  • 7,193일 = 19년 + 253일 (윤년 포함 - 2000,2004,2008,2012,2016년)
  • 253일 = 1~8월(31+28+31+30+31+30+31+31) + 10일
  • => 19년 + 1~8월 + 10일 후 = 2019년 9월 11일

수치모델의 시간 속성정보2

 

수치모델의 시간변환2
수치모델의 시간변환2

 위와 같이 172632시간은 2000년 1월 1일 이후로 172,632시간이 지난 시점은 2019년 9월 11일 0시가 된다. 계산이 꽤나 복잡해 보이지만 파이썬 내에서 쉽게 계산할 수 있다. datetime 라이브러리를 활용하면 되는데 이는 글 마지막에서 설명하도록 하겠다.

 

2. 표준시 (GMT, UTC, KST) 변환

 모델은 UTC 기준, 우리나라는 UTC +9

 각 나라는 시차가 존재하여 서로 시간이 상이한데, 수치모델은 보통 UTC를 사용한다. UTC는 Coordinated Universal TIme으로 협정세계시다. GMT는 그리니치 평균시로 UTC와 GMT는 소수점단위의 초 정도만 차이가 나기 때문에 동일한 시간표준으로 이해해도 좋다.

 우리나라의 시간대는 KST로 국제표준시보다 9시간이 빠르다. 그래서 우리나라의 시간을 GMT +9 또는 UTC +9와 같이 표기한다. 그 말은 위 수치모델의 시간은 우리나라 시간보다 9시간 늦은 시간이므로 저 시각에서 9시간을 더해줘야 우리나라의 시간이 된다. 따라서 위의 2019년 9월 11일 0시는 우리나라 시간으로 2019년 9월 11일 9시가 된다. 수치모델을 분석할 때는 이를 반드시 유념하고 처리해야한다.

 

3. datetime, timedelta로 시간변환하기

datetime('기준일') + timedelta('시간')

 이제 julian day의 개념도 알았고, 우리나라 시간으로 변환하는 것도 이해했으니, 이를 코드로 구현해보도록 하겠다. 파이썬 datetime에는 timedelta라는 툴이 있다. 특정 시간대의 시간차를 계산하는 라이브러리인데 기준일에다가 해당시간만큼의 timedelta를 더해주면 된다. datetime.datetime(기준일) + datetime.timedelta(시간차이)를 해주면 해당 시각이 되는 것이다. 위의 모델의 기준일은 2000년 1월 1일이고 timedelta는 172632시간이므로 아래와 같이 입력하면 된다.

datetime.datetime(2000, 1, 1) + datetime.timedelta(hours = 172632)

하지만 우리나라 시간대는 +9를 해줘야 하므로,

datetime.datetime(2000, 1, 1, 9) + datetime.timedelta(hours = 172632)

 

마지막으로 nc파일에서 읽은 시간값은 172632부터 3시간씩 172653까지인데, 이는 아래와 같이 for문을 통해 변환하면 된다.

import datetime
times = [datetime.datetime(2000, 1, 1, 9) + datetime.timedelta(hours=hour) for hour in time]

우리나라 시간으로 변환된 모델 내 시간값
우리나라 시간으로 변환된 모델 내 시간값

 

이렇게 수치모델의 시간을 우리가 사용하는 시간형식으로 변환할 수 있다.

반응형