본문 바로가기

Programming/파이썬

[Python] Date, Time 관련 함수 정리

안녕하세요, Python 사용자 여러분! 오늘은 Python에서 날짜와 시간을 다루는 데 필수적인 함수들에 대해 알아보겠습니다. 일상적인 프로그래밍에서 날짜와 시간 데이터는 빈번하게 사용되며, 이를 효율적으로 처리하는 것은 데이터 분석, 웹 개발, 자동화 스크립트 작성 등 다양한 분야에서 중요합니다. 그러나 많은 분들이 이러한 함수들을 사용할 때 혼란을 겪곤 합니다. 이 포스트를 통해 Python의 Date와 Time 관련 기본 함수들을 명확하게 이해하고, 여러분의 코드에 적용해보세요.

 

 

datetime 모듈

Python의 datetime 모듈은 날짜와 시간을 다루기 위한 다양한 클래스를 제공합니다. 이 모듈을 사용하면 현재 날짜와 시간을 얻거나, 특정 날짜/시간으로 객체를 생성할 수 있습니다.

 

주요 클래스와 함수

  • date: 날짜를 나타내는 클래스입니다. 연, 월, 일 정보를 다룹니다.
  • time: 시간을 나타내는 클래스입니다. 시, 분, 초, 마이크로초 정보를 포함합니다.
  • datetime: 날짜와 시간을 모두 포함하는 클래스입니다. 가장 많이 사용되는 클래스 중 하나입니다.
  • timedelta: 두 날짜나 시간 사이의 기간을 나타냅니다.

 

임포트 방법

1. 전체 모듈 임포트: 'import datetime'

  • 이 방법을 사용하면 모듈 내의 모든 클래스와 함수에 'datetime.' 접두어를 붙여서 접근해야 합니다. 
  • 예: 'datetime.datetime', 'datetime.timedelta'

2. 특정클래스 임포트 'from datetime import datetime'

  • 이 방법을 사용하면 지정한 클래스나 함수를 모듈 이름 없이 직접 사용할 수 있습니다. 
  • 예: 'datetime' ('datetime.datetime' 대신 사용)
# datetime 모듈 전체를 임포트하는 경우
import datetime

# 현재 날짜와 시간
now = datetime.datetime.now()
print("현재 시간:", now)

# 특정 날짜와 시간
specific_date = datetime.datetime(2024, 1, 12, 15, 30)
print("특정 날짜와 시간:", specific_date)

# 날짜와 시간 차이
time_difference = datetime.timedelta(days=5)
future_date = now + time_difference
print("5일 후:", future_date)

# time 모듈 임포트
import time

# 현재 시간 (UNIX 타임스탬프)
current_time = time.time()
print("현재 UNIX 타임스탬프:", current_time)

 

 

날짜와 시간 형식화

1. datetime 객체를 문자열로 변환하기(strftime)

  • 'strftime' 메소드를 사용하면 'datetime' 객체를 지정된 형식의 문자열로 변환할 수 있습니다. 
  • 예를 들어, 날짜와 시간을 "년-월-일 시:분:초" 형식으로 표시하고 싶은 경우 사용할 수 있습니다. 
from datetime import datetime

now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print("형식화된 날짜와 시간:", formatted_date)

 

2. 문자열을 datetime 객체로 변환하기 (strptime)

  • 'strptime' 매소드는 문자열을 'datetime' 객체로 변환하는 데 사용됩니다. 
  • 문자열의 형식을  정확히 알고 있어야 하며, 이 형식에 맞추어 'strptime'에 전달합니다. 

date_string = "2024-01-12 15:30:00"
date_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print("문자열에서 변환된 날짜와 시간:", date_object)

 

주요 형식 지정자

  • %Y: 4자리 연도 (예: 2024)
  • %m: 2자리 월 (예: 01)
  • %d: 2자리 일 (예: 12)
  • %H: 2자리 시간 (24시간 형식, 예: 15)
  • %M: 2자리 분 (예: 30)
  • %S: 2자리 초 (예: 00)

 

f-문자열(f-string)을 이용한 날짜와 시간 형식화

Python에서 f-문자열(Formattable String Literal)을 사용하면 변수 값을 문자열 내부에 직접 삽입할 수 있습니다. 날짜와 시간을 표시하는 경우, 'datetime' 객체를 f-문자열 내에서 직접 형식화 할 수 있습니다. 

from datetime import datetime

now = datetime.now()
formatted_date = f"{now:%Y-%m-%d %H:%M:%S}"
print("f-문자열을 사용한 형식화된 날짜와 시간:", formatted_date)

 

Timestamp

Timestamp는 특정 시점을 나타내는 시간의 한 형태로, 일반적으로 1970년 1월 1일 00:00:00 UTC(유닉스 시간의 시작점, Epoch라고 함)부터 특정 시점까지의 총 초를 나타냅니다. 

 

Timestamp의 원리

  • 컴퓨터 시스템에서는 시간을 연속적인 숫자로 표현하는 것이 효율적입니다.  이 때 사용되는 것이 바로 timestamp 입니다. 
  • Timestamp는 시간대에 무관하게 전 세계적으로 동일한 시점을 나타내므로, 서로 다른 시간대에 있는 시스템간의 시간을 조정하는데 유용합니다. 
import time
from datetime import datetime

# 현재 시간의 Timestamp 얻기
current_timestamp = time.time()
print("현재 Timestamp:", current_timestamp)

# Timestamp를 datetime 객체로 변환
date_from_timestamp = datetime.fromtimestamp(current_timestamp)
print("Timestamp에서 datetime:", date_from_timestamp)

# 문자열을 datetime 객체로 변환 후 Timestamp로 변환
date_string = "2024-01-12 15:30:00"
date_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
timestamp_from_string = date_object.timestamp()
print("문자열에서 Timestamp:", timestamp_from_string)

timestamp = 1673525400  # 예시 timestamp

# timestamp를 datetime 객체로 변환
dt_object = datetime.fromtimestamp(timestamp)

# strftime()을 사용한 형식화
formatted_date = dt_object.strftime("%Y-%m-%d %H:%M:%S")
print("strftime을 사용한 형식화:", formatted_date)

# f-string을 사용한 형식화
formatted_date_fstring = f"{dt_object:%Y-%m-%d %H:%M:%S}"
print("f-string을 사용한 형식화:", formatted_date_fstring)

 

SQLAlchemy에서의 Timestamp 지정

SQLAlchemy에서 'declarative_base'를 사용하여 모델을 정의할 때, 'DateTime' 필드를 사용하여 Timestamp를 표현할 수 있습니다. 

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, DateTime
import datetime

Base = declarative_base()

class MyModel(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    timestamp = Column(DateTime, default=datetime.datetime.utcnow)

여기서 'DateTime' 필드는 Python의 'datetime.datetime' 객체와 호환됩니다. 

' default=datetime.datetime.utcnow'는 레코드가 생성될 때 현재 UTC 시간을 기본값으로 설정합니다. 

 

Pydantic에서의 Timestamp 지정

Pydantic에서는 'BaseModel'을 사용하여 데이터 모델을 정의합니다. Timestamp를 표현하기 위해 Python의 'datatime' 모듈을 사용할 수 있습니다. 

from pydantic import BaseModel
from datetime import datetime

class MyModel(BaseModel):
    id: int
    timestamp: datetime

 

이 경우, 'timestamp' 필드는 'datetime.datetime' 타입으로 정의 됩니다. Pydantic은 이를 자동으로 JSON형식의 날짜와 시간 문자열로 변환하여 처리합니다. 

 

 

타임존 (시간대, Timezone)

글로벌 서비스를 운영하거나 여러 시간대에 걸친 데이터를 처리할 때, 타임존을 고려하여 일관된 시간 정보를 유지하는 것이 중요합니다. 특정 지역의 행사나 예약 시스템 등에서는 정확한 로컬 시간이 피요합니다. 이 때 타임존을 고려하지 않으면 큰 혼란을 야기할 수 있습니다. 

Python에서의 타임존 다루기

Python의 'datetime' 모듈은 기본적으로 'naive' 날짜와 시간 객체를 다루지만, 'aware'객체를 사용하여 타인존 정보를 포함시킬 수 있습니다. 

  • Aware 객체 생성하기: Aware 'datetime' 객체는 특정 타임존의 날짜와 시간 정보를 포함합니다. 이를 위해 'pytz' 라이브러리와 같은 타임존 정보를 제공하는 외부 라이브러리를 사용할 수 있습니다. 
  • 'pytz' 사용하기: pytz 라이브러리는 전 세계의 다양한 타임존을 지원하며, 이를 사용하여 타임존을 쉽게 변환할 수 있습니다. 
from datetime import datetime
import pytz

utc = pytz.utc
kst = pytz.timezone('Asia/Seoul')

now = datetime.now(utc)
kst_now = now.astimezone(kst)
print("UTC 시간:", now)
print("KST 시간:", kst_now)


SQLAlchemy와 Pydantic에서의 타임존

  • SQLAlchemy: SQLAchemy에서는 'DateTime' 필드를 사용할 때 'timezone=True' 옵션을 설정하여 타임존을 지원하는 컬럼을 만들 수 있습니다. 
from sqlalchemy import Column, DateTime, create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Event(Base):
    __tablename__ = 'events'
    id = Column(Integer, primary_key=True)
    timestamp = Column(DateTime(timezone=True))
  • Pydantic: Pydantic에서는 'datetime' 필드를 사용하고, 타임존을 명시적으로 설정하여 모델을 정의할 수 있습니다. 
from pydantic import BaseModel
from datetime import datetime

class Event(BaseModel):
    timestamp: datetime

Pydantic은 'datetime' 객체를 자동으로 처리하며, 타임존 정보가 포함된 객체를 사용할 수 있습니다. 

 

 

마지막으로 몇가지 실제로 많이 적용될 만한 예제를 정리하면서 마무리하겠습니다. 

내용 중 잘못된 정보가 있다거나 추가로 궁금한 사항이 있으면 댓글 남겨 주세요. 

 

1. 현재 시간을 다양한 형식으로 표시하기

from datetime import datetime
import pytz

# 현재 UTC 시간
utc_now = datetime.now(pytz.utc)
print("현재 UTC 시간:", utc_now.strftime("%Y-%m-%d %H:%M:%S %Z"))

# 현재 KST 시간 (한국 시간대)
kst = pytz.timezone('Asia/Seoul')
kst_now = utc_now.astimezone(kst)
print("현재 KST 시간:", kst_now.strftime("%Y-%m-%d %H:%M:%S %Z"))


2. 사용자의 생일로 부터 현재까지의 기간 계산하기

user_birthday = datetime.strptime('1990-01-01', '%Y-%m-%d')
age = datetime.now() - user_birthday
print("당신의 나이 (일 단위):", age.days)

 

3. 특정 이벤트까지 남은 시간 계산하기

event_date = datetime(2024, 12, 31, 23, 59, 59)
current_time = datetime.now()
countdown = event_date - current_time
print("이벤트까지 남은 시간 (초 단위):", countdown.total_seconds())

 

4. 타임스탬프와 문자열 변환하기 (본문 중에도 있었지만 한번 더)

# 타임스탬프를 datetime 객체로 변환
timestamp = 1609459200
date_time = datetime.fromtimestamp(timestamp)
print("타임스탬프에서 변환된 날짜:", date_time.strftime("%Y-%m-%d %H:%M:%S"))

# datetime 객체를 타임스탬프로 변환
new_timestamp = datetime.now().timestamp()
print("현재 시간의 타임스탬프:", new_timestamp)


5. 특정 요일까지 남은 일수 계산하기

from datetime import datetime, timedelta

def days_until_weekday(weekday):
    today = datetime.now()
    target_weekday = today.weekday() + weekday - (today.weekday() + 7) % 7
    if target_weekday == 0:
        target_weekday = 7
    return target_weekday

# 예: 다음 주 금요일까지 남은 일수 계산 (0: 월요일, 6: 일요일)
days_to_friday = days_until_weekday(4)
print("다음 주 금요일까지 남은 일수:", days_to_friday)


6. 특정 기간 동안의 모든 날짜 나열하기

def list_dates(start_date, end_date):
    current_date = start_date
    while current_date <= end_date:
        print(current_date.strftime("%Y-%m-%d"))
        current_date += timedelta(days=1)

start_date = datetime(2024, 1, 1)
end_date = datetime(2024, 1, 7)
list_dates(start_date, end_date)

 

7. 특정 월의 마지막 날짜 구하기

import calendar

def last_day_of_month(year, month):
    last_day = calendar.monthrange(year, month)[1]
    return datetime(year, month, last_day)

last_day = last_day_of_month(2024, 2)
print("해당 월의 마지막 날짜:", last_day.strftime("%Y-%m-%d"))


8. 두 날짜 사이의 모든 월요일 나열하기

def all_mondays(start_date, end_date):
    current_date = start_date
    while current_date <= end_date:
        if current_date.weekday() == 0:  # 월요일
            print(current_date.strftime("%Y-%m-%d"))
        current_date += timedelta(days=1)

start_date = datetime(2024, 1, 1)
end_date = datetime(2024, 2, 1)
all_mondays(start_date, end_date)


9. 특정 날짜가 속한 주의 모든 날짜 나열하기

def week_dates(date):
    start_week = date - timedelta(days=date.weekday())
    for i in range(7):
        print((start_week + timedelta(days=i)).strftime("%Y-%m-%d"))

specific_date = datetime(2024, 1, 15)
week_dates(specific_date)

 

'Programming > 파이썬' 카테고리의 다른 글

[파이썬] 맵 함수 - map()  (0) 2023.09.10
[파이썬] lambda 함수  (0) 2023.09.10
[파이썬] 리스트 컴프리헨션  (0) 2023.09.10