개요
최근 Airflow 2.5.1 버전에서 2.8.2 버전으로 업그레이드 테스트를 진행하고 있는데, Airflow의 Dag run context의 execution_date 값의 문자열 형식이 다음과 같이 바뀐 것 같다.
스케쥴에 의한 트리거 | 매뉴얼 트리거 | |
2.5.1 | 2024-07-31T00:00:00+00:00 | 2023-05-10T01:51:17.686430+00:00 |
2.8.2 | 2024-07-31 00:00:00+00:00 | 2023-05-10 01:51:17.686430+00:00 |
execution_date 값의 문자열 데이터를 파싱 하는 부분이 있어서... 변경된 형식을 기존 형식으로 변경하고 싶다.
확인해 보니 기존 형식이 ISO 8601 형식인 것 같다. python에서 datetime 값을 ISO 8601 형식 문자열로 변환하는 isoformat에 대해 적어둔다.
isoformat
datetime.isoformat 함수는 ISO 8601 형식으로 날짜와 시간을 나타내는 문자열을 반환한다.
변환할 datetime의 microsecond와 timezone에 따라서 문자열 형식이 조금 달라지는데, 그 형식은 다음과 같다.
- microsecond가 0이 아닌 경우 : YYYY-MM-DDTHH:MM:SS.ffffff
- microsecond가 0인 경우 : YYYY-MM-DDTHH:MM:SS
from datetime import datetime
now = datetime.now()
print(now.isoformat())
print(now.replace(microsecond=0).isoformat())
이때, timezone 정보가 포함되어 있으면 다음과 같은 형식으로 UTC 오프셋을 제공하는 문자열을 덧붙인다.
- microsecond가 0이 아닌 경우 : YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM
- microsecond가 0인 경우 : YYYY-MM-DDTHH:MM:SS+HH:MM
from datetime import datetime
from datetime import timezone
now = datetime.now(tz=timezone.utc)
print(now.isoformat())
print(now.replace(microsecond=0).isoformat())
fromisoformat
datetime.fromisoformat 함수는 isoformat 함수와 반대로 ISO 8601 형식의 날짜/시간 문자열, 보다 정확하게는 isoformat이 반환할 수 있는 형식의 문자열을 datetime 객체로 변환한다.
from datetime import datetime
from datetime import timezone
str_now = datetime.now(tz=timezone.utc).isoformat()
now = datetime.fromisoformat(str_now)
print(now)
print(now.__repr__())
참고 문서
https://docs.python.org/ko/3/library/datetime.html#datetime.datetime.isoformat
https://docs.python.org/ko/3/library/datetime.html#datetime.datetime.fromisoformat