ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] datetime 여러 활용법 알아보기 ( datetime, timezone, truncate)
    Python 2024. 1. 10. 16:58
    728x90
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 Python 의 Datetime 모듈의 여러가지 사용 사례들을 작성해보려고 합니다.

    Python 개발을 하다보면 Datetime 모듈을 활용해야하는 경우가 많습니다.

    저의 경우에는 매번 "Timezone" 을 어떻게 변경할지, 오늘의 시작/종료 시각으로 어떻게 변경할지 등에 대해서 항상 헷갈리곤 합니다.

    그래서 이번 블로그에서 여러가지 케이스와 Datetime 응용하는 사례에 대해서 설명해보려고 합니다.

     

     

    여러가지 사례들.

    python 의 Datetime 모듈의 활용법은 아래와 같습니다.

    datetime 라이브러리에서 datetime 모듈을 import 하는 구조로 보통 활용됩니다.

    from datetime import datetime, timezone

     

    가장 흔히 사용되는 함수는 now 함수일텐데요.

    now 함수는 현재 시각의 datetime 객체를 생성하는 함수입니다.

    now 함수를 사용하면서 유의해야할 점은 now 함수는 timezone 정보를 포함하지 않아서 에러를 유발할 수 있다는 점입니다.

    그래서 timezone 을 명시해주는 방식을 권장드립니다.

    from datetime import datetime, timezone
    
    now = datetime.now()
    print(now.tzinfo)
    print(now.tzname())
    # None
    
    now = datetime.now(timezone.utc)
    print(now.tzinfo)
    print(now.tzname())
    # UTC
    
    now = datetime.utcnow()
    print(now.tzinfo)
    print(now.tzname())
    # None

     

     

    UTC 시간은 한국시간으로 어떻게 변경하지 ? (astimezone)

    datetime 객체의 Timezone 를 변경하는 방법에 대해서 알아보겠습니다.

    datetime 객체는 내부적으로 astimezone 이라는 함수가 존재하는데요.

    astimezone 함수를 통해서 datetime 객체의 Timezone 을 변경할 수 있습니다.

     

    astimezone 의 활용 예시는 아래와 같으며, 시각 정보는 동일하되 timezone 의 설정만이 변경됩니다.

    from datetime import datetime, timezone, timedelta
    
    utc_now = datetime.now(timezone.utc)
    print(utc_now)
    # 2024-01-18 23:51:50.076494+00:00
    
    utc_kst = utc_now.astimezone(tz=timezone(timedelta(hours=9)))
    print(utc_kst)
    # 2024-01-19 08:51:50.076494+09:00
    
    print(utc_now == utc_kst)
    # True

     

     

    시각 정보를 그대로두고 Timezone 만 변경하기. ( replace )

    모종의 이유로 시각 정보는 그대로두고 Timezone 만을 변경해야하는 경우가 간혹 존재합니다.

    예를 들어, 2022-01-01 00:00:00 (UTC) 를 2022-01-01 00:00:00 (KST) 로 변경하는 경우를 의미합니다.

    이때에 replace 함수를 사용하여 datetime 의 timezone 만을 교체할 수 있습니다.

    그리고 이 경우는 원본 datetime 과 시간의 격차가 발생하게 됩니다.

    from datetime import datetime, timezone, timedelta
    
    utc_now = datetime.now(timezone.utc)
    print(utc_now)
    # 2024-01-18 23:59:19.019978+00:00
    
    utc_kst = utc_now.replace(tzinfo=timezone(timedelta(hours=9)))
    print(utc_kst)
    # 2024-01-18 23:59:19.019978+09:00
    
    print(utc_now == utc_kst)
    # False
    
    print(utc_now - utc_kst)
    # 9:00:00

     

     

    어제의 종료시각을 찾기. ( StartOfDay, EndOfDay, truncate )

    start of day, end of day 와 같이 시각 정보를 Truncate 해야하는 경우가 종종 존재합니다.

    datetime 모듈은 replace 함수를 통해서 초/분/시 등의 단위를 Truncate 할 수 있습니다.

     

    어제 종료시각을 찾는 과정은 아래와 같습니다.

    먼저 utc 기준의 datetime 객체가 존재할 때에 이를 한국시간대로 변경합니다.

    왜냐하면 utc 기준으로 어제와 한국시간 기준으로 어제는 다르기 때문입니다.

    그리고 timedelta 를 통해서 하루치의 시간만큼 마이너스 (-) 연산을 수행하고

    replace 함수를 통해서 Truncate 를 수행합니다.

    from datetime import datetime, timezone, timedelta
    
    utc_now = datetime.now(timezone.utc)
    print(utc_now)
    # 2024-01-19 00:05:39.349534+00:00
    
    now_kst = utc_now.astimezone(tz=timezone(timedelta(hours=9)))
    print(now_kst)
    # 2024-01-19 09:05:39.349534+09:00
    
    yesterday_kst = now_kst - timedelta(days=1)
    print(yesterday_kst)
    # 2024-01-18 09:05:39.349534+09:00
    
    start_of_yesterday_kst = yesterday_kst.replace(hour=0, minute=0, second=0, microsecond=0)
    print(start_of_yesterday_kst)
    # 2024-01-18 00:00:00+09:00
    
    start_of_yesterday_utc = start_of_yesterday_kst.astimezone(tz=timezone(timedelta(hours=0)))
    print(start_of_yesterday_utc)
    # 2024-01-17 15:00:00+00:00

     

     

    반응형

    'Python' 카테고리의 다른 글

    [Python] io.BytesIO truncate 알아보기  (0) 2024.02.22
    [Pandas] Series CRUD 알아보기  (0) 2024.02.21
    Seaborn heatmap 그리기  (0) 2024.01.07
    Seaborn countplot 그리기  (0) 2024.01.07
    [Pandas] rolling function 알아보기  (0) 2023.12.03
Designed by Tistory.