2022-07-03 16:38:52

파이썬에서 날짜, 시간 데이터를 다룰 때 주로 사용되는 모듈은 바로 datetime입니다. 그런데 사용해보신 분들은 아시겠지만, 생각보다 사용법이 직관적이지 않고 복잡합니다. 그래서 사용할 때마다 다시 구글링해서 사용법을 확인하고 적용할 때가 많습니다. 개발자들은 이런 상황을 절대 가만히 보고 있을리가 없죠. 누군가는 대안을 만듭니다. 그 대안 중 하나가 바로 arrow 모듈입니다.

 

arrow 모듈

공식 사이트: https://arrow.readthedocs.io/en/latest/

 

위 arrow 모듈 공식 사이트의 첫 소개말을 한글로 번역하자면 다음과 같습니다.

 

"arrow는 날짜, 시간, 타임스탬프를 생성하고, 조작하고, 포맷팅하고, 전환하는 것에 있어서 사용자 친화적인 인터페이스를 제공하는 파이썬 라이브러리입니다."

 

여기서 "사용자 친화적"이라는 수식어가 중요합니다. 제가 생각하기에 datetime 모듈은 그다지 사용자 친화적이지 않습니다. 예를 들어서 현재 한국 서울 날짜 시간에 3시간을 더한 다음에 문자열로 변환하는 코드를 datetime 모듈을 활용해서 구현해보겠습니다.

 

datetime 모듈 vs arrow 모듈

import datetime
from pytz import timezone
from dateutil import relativedelta

now = datetime.datetime.now(timezone('Asia/Seoul')) # 서울 현재 일시 얻기
print("서울 현재 일시: ", now, '\n')

now_plus_3hours = now + relativedelta.relativedelta(hours=3) # 3시간 더하는 코드
print("서울 3시간 후 일시: ", now_plus_3hours, '\n')

now_plus_3hours_str = now_plus_3hours.strftime('%Y-%m-%d %H:%M:%S') # datetime 객체 문자열로 변경
print("서울 3시간 후 일시(문자열): ", now_plus_3hours_str, '\n')

 

 

위 코드를 보시면 간단한 작업인 것 같은데도 datetime 모듈 뿐만 아니라 pytz 모듈과 dateutil 모듈도 추가적으로 있어야 이 작업을 수행할 수 있습니다. 또한 datetime 객체를 문자열로 변환해주는 strftime이라는 메소드 이름도 복잡합니다. 이 메소드랑 쌍으로 같이 쓰이는 메소드는 strptime인데 이름도 너무 비슷할 뿐더러 어떤 일을 하는 메소드인지 이름으로부터 확 와닿지가 않습니다.

 

이번에는 arrow 모듈을 활용해서 동일한 기능을 수행하는 코드를 작성해보겠습니다.  

import arrow

now = arrow.now('Asia/Seoul') # 서울 현재 일시 얻기
print("서울 현재 일시: ", now, '\n')

now_plus_3hours = now.shift(hours = 3) # 3시간 더하는 코드
print("서울 3시간 후 일시: ", now_plus_3hours, '\n')

now_plus_3hours_str = now_plus_3hours.format("YYYY-MM-DD HH:mm:ss")
print("서울 3시간 후 일시(문자열): ", now_plus_3hours_str, '\n')

 

 

일단 코드가 훨씬 아름다워졌습니다. 아름다움을 추구하는 파이썬에 더 부합한 코드라고 볼 수 있습니다. 시간 정보를 더하거나 뺄 때 사용되는 메소드의 이름도 shift로 훨씬 와닿고, 문자열로 포맷팅해주는 메소드 이름도 format으로 훨씬 단순합니다.  

 

 

 

 

arrow 모듈 사용법 정리

이제 본격적으로 arrow 모듈 사용법을 정리해보겠습니다.

 

1) 날짜, 시간 정보 얻어서 arrow 객체 생성하기

get 메소드를 활용하여 입력받은 매개변수들을 토대로 arrow 객체를 생성할 수 있습니다.

 

 

2) 현재 시간 정보 얻기

협정 세계시(utc)를 얻으려면 utcnow 메소드를 활용하면 됩니다.

 

 

사용하고 있는 PC 또는 서버의 시간을 얻으려면 now 메소드를 활용합니다. 한국 시간이라 맨 뒤에 +09:00이 붙었습니다. 이 부분의 의미는 utc로부터 +9시라는 뜻입니다. 

 

 

프랑스 파리의 시간을 얻으려면 매개변수로 타임존 정보를 전달합니다.

 

 

3) 날짜, 시간 더하거나 빼기

날짜 및 시간을 더하거나 뺄 때는 shift 메소드를 사용합니다. 현재 일시에 1년을 더하고, 2개월을 더하고, 3일을 더하고, 4시간을 더하고, 6분을 더하고, 7초를 더해보겠습니다.

 

 

4) 날짜, 시간 정보 바꾸기

날짜 및 시간 정보를 바꿀 때는 replace 메소드를 활용하면 됩니다. 현재 일시에서 월 정보를 4로 바꿔보겠습니다.

 

 

7월이 4월로 바뀐 것을 확인하실 수 있습니다. 주의하실 것은 shift 메소드와 달리 year, month 등에 s가 안 붙는다는 것입니다. 

 

5) 타임존 변경하기

타임존을 바꿀 때는 to 메소드를 사용합니다. 서울시를 런던시로 바꿔보겠습니다.

 

 

한국이 오후 3시면 영국 런던은 아침 7시네요. 뒷부분에 +09:00가 +01:00로 바뀐 것도 확인할 수 있습니다.

 

6) arrow 객체 문자열로 변환하기

arrow 객체를 문자열로 변환해주는 메소드는 format입니다.

 

 

오늘은 datetime 모듈을 대신할 수 있는 arrow 모듈에 대해서 알아봤습니다. 사용법이 한결 간단하죠? 혹시 제가 이해한 부분에 오류가 있다면 알려주시기 바랍니다. 감사합니다. 

 

관련 글

[python] datetime 모듈 strftime 메소드, 포맷(format) 코드 정리  

[python] datetime 모듈로 일, 시간, 분, 초 더하거나 빼는 방법 

[python] datetime 객체 strptime, strftime 메소드 활용법  

[python] 현재 시간 출력하기 (+살아온 날 수 계산하기)