본문 바로가기
[업무 지식]/Python

[pandas 라이브러리] DATEUTIL

by 에디터 윤슬 2024. 10. 30.
 

datetime & dateutil

  • 파이썬 라이브러리 중 시간을 쉽게 다루게 하는 datetiem, dateutil

datetime

  • 파이썬 표준 라이브러리: 날짜와 시간을 처리하는 다양한 클래스와 함수 제공
  • 기능: 날짜 연산부터 현지 시간과 타임존을 다룰 수 있다.
from datetime import datetime

# 현재 날짜와 시간
now = datetime.now()
print(now)  # 예: 2024-10-30 15:45:00

dateutil

  • 서드 파티 라이브러리: datetime의 확장 기능을 제공
  • 기능: 복잡한 날짜 규칙 및 타임존을 쉽게 다룰 수 있도록 지원. 다양한 날짜 형식을 자동으로 감지하고 처리할 수 있다.
설치
pip install python-dateutil

 

 

 

문자열 -> 데이트타입 변환

strptime() : datetime 라이브러리

from datetime import datetime

# 문자열로 된 날짜
date_string = "2022-02-20"

# 문자열을 datetime 객체로 변환
date_object = datetime.strptime(date_string, "%Y-%m-%d")

print(type(date_object))  # <class 'datetime.datetime'>
print(date_object)  # 2022-02-20 00:00:00

 

parse() : dateutil 라이브러리

from dateutil import parser

# 특정 포맷으로 된 날짜 문자열
date_string = "2022-02-20"

# 특정 포맷을 지정하여 문자열을 datetime 객체로 변환
date_object = parser.parse(date_string)
date = date_object.date()
print(type(date_object))  # <class 'datetime.datetime'>
print(date_object)  # 2022-02-20 00:00:00
print(type(date))  # <class 'datetime.date'>
print(date)  # 2022-02-20

기능 비교

  • 'datetime.strptime()' 특정 형식의 문자열을 datetime 객체로 변환. 형식을 명시적으로 지정해야 한다.
  • 'dateutil.parser.parse()' 함수는 날짜 및 시간 형식을 자동으로 감지하여 처리한다. 입력 문자열이 다양한 형식으로 지정되어 있는 경우 유용

 

 

데이트 타입 -> 문자열 변환

datetime 라이브러리

from datetime import datetime

# 날짜 및 시간 문자열
date_string = "2022-02-20 15:30:00"

# 문자열을 datetime 객체로 파싱
date = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(type(date))  # <class 'datetime.datetime'>
print(date)  # 2022-02-20 15:30:00

# str 변환 방법1
parsed_datetime1 = str(date)
print(type(parsed_datetime1))  # <class 'str'>
print(parsed_datetime1)  # 2022-02-20 15:30:00

# str 변환 방법2 (원하는 형식으로 변환 가능)
parsed_datetime2 = datetime.strftime(date, '%Y.%m.%d')
print(type(parsed_datetime2))  # <class 'str'>
print(parsed_datetime2)  # 2022.02.20

 

dateutil 라이브러리

from dateutil import parser
from datetime import datetime

# 날짜 및 시간 문자열
date_string = "2022-02-20 15:30:00"

# 문자열을 datetime 객체로 파싱
date = parser.parse(date_string)
print(type(date))  # <class 'datetime.datetime'>
print(date)  # 2022-02-20 15:30:00

# str 변환 방법1
parsed_datetime1 = str(date)
print(type(parsed_datetime1))  # <class 'str'>
print(parsed_datetime1)  # 2022-02-20 15:30:00

# str 변환 방법2 (원하는 형식으로 변환 가능)
parsed_datetime2 = datetime.strftime(date, '%Y.%m.%d')
print(type(parsed_datetime2))  # <class 'str'>
print(parsed_datetime2)  # 2022.02.20

 

 

시간 요소 가져오기

print(datetime.now().date())  # 날짜  2022-03-18
print(datetime.now().year)  # 년  2022
print(datetime.now().month)  # 월  3
print(datetime.now().weekday())  # 요일(숫자)  4
print(datetime.now().day)  # 날짜  18
print(datetime.now().time())  # 시간(시분초)  16:46:27.032934
print(datetime.now().hour)  # 시간  16
print(datetime.now().minute)  # 분  46
print(datetime.now().second)  # 초  27

 

 

 

상대적인 시간 계산

기능 비교

  • 'datetime.timedelta': 일(day)을 기준으로 상대적인 시간을 계산
  • 'dateutil.relativedelta': 월(month)을 포함한 다양한 단위로 상대적인 시간을 계산

timedelta(): datetime 라이브러리

from datetime import datetime, timedelta

# 현재 날짜 및 시간 객체
current_datetime = datetime.now()

# 상대적인 시간 표현을 위해 timedelta 객체 생성
time_difference = timedelta(days=1, hours=3, minutes=30)

# 현재 시간으로부터 지난 시간 계산
result_datetime = current_datetime - time_difference

print(result_datetime)  # 2024-02-22 08:44:59.890997
상대적 시간 관리의 경우 datetime 사용 시 문제점
  • datetime.timedelta는 일 기준으로 간격을 처리하므로 월 간격을 처리하기 어렵다
  • 1월 31일(예시)에 지정한 한 달(30일)만 더할 수 있다
from datetime import datetime, timedelta

start_date = datetime(2022, 1, 31)
one_month = timedelta(days=30)

# 한 달을 더하는 경우
end_date = start_date + one_month
print("End Date:", end_date)  # End Date: 2022-03-02 00:00:00

relativedelta() : dateutil 라이브러리

from datetime import datetime
from dateutil.relativedelta import relativedelta

# 현재 날짜 및 시간 객체
current_datetime = datetime.now()

# 상대적인 시간 표현을 위해 relativedelta 객체 생성
time_difference = relativedelta(days=1, hours=3, minutes=30)

# 현재 시간으로부터 지난 시간 계산
result_datetime = current_datetime - time_difference

print(result_datetime)  # 2024-02-22 08:46:11.834557
dateutil 사용으로 문제 해결
from dateutil.relativedelta import relativedelta
from datetime import datetime

start_date = datetime(2022, 1, 31)

# 한 달을 더하는 경우
end_date = start_date + relativedelta(months=1)
print("End Date:", end_date)  # End Date: 2022-02-28 00:00:00

 

 

 

타임존 관리

기능 비교

  • 'datetime.timezone' 및 'astimezone()': 기본적인 타임존 변환 기능 제공 
  • 'dateutil.tz.gettz()' 및 'tz.tzutc()': 특정 지역의 타임존 정보를 쉽게 가져올 수 있다

timezone, astimezone(): datetime 라이브러리

뉴욕 (미국 동부): timezone(timedelta(hours=-5)) (UTC-5)
로스앤젤레스 (미국 서부): timezone(timedelta(hours=-8)) (UTC-8)
런던 (영국): timezone(timedelta(hours=0)) (UTC+0)
파리 (프랑스): timezone(timedelta(hours=1)) (UTC+1)
도쿄 (일본): timezone(timedelta(hours=9)) (UTC+9)
대한민국 (서울): timezone(timedelta(hours=9)) (UTC+9)
시드니 (호주 동부): timezone(timedelta(hours=10)) (UTC+10)
주의: 일부 국가 및 지역은 여러 개의 시간대를 가질 수 있습니다. pytz 라이브러리를 활용하여 UTC 시간대를 확인 할 수도 있습니다.

 

from datetime import datetime, timedelta, timezone

# UTC(표준 시간) 타임존 생성
utc_timezone = timezone.utc

# 현재 시간을 UTC로 설정
current_time_utc = datetime.now(utc_timezone)

print("Current Time (UTC):", current_time_utc)  # Current Time (UTC): 2024-02-23 03:22:14.797708+00:00

# 뉴욕 타임존 생성
ny_timezone = timezone(timedelta(hours=-5))

# UTC 시간을 뉴욕 타임존으로 변환
current_time_ny = current_time_utc.astimezone(ny_timezone)  # Current Time (New York): 2024-02-22 22:22:14.797708-05:00

print("Current Time (New York):", current_time_ny)

 

tz.tzutc(), tz.gettz() : dateutil 라이브러리

“America/New_York”: 미국 동부의 타임존
“Europe/London”: 영국의 타임존
“Asia/Tokyo”: 일본의 타임존
“Asia/Korea”: 대한민국의 타임존
“Australia/Sydney”: 호주 동부의 타임존
from datetime import datetime
from dateutil import tz

# UTC(표준 시간) 타임존 생성
utc_timezone = tz.tzutc()

# 현재 시간을 UTC로 설정
current_time_utc = datetime.now(utc_timezone)

print("Current Time (UTC):", current_time_utc)  # Current Time (UTC): 2024-02-23 03:23:31.356146+00:00

# 뉴욕 타임존 생성
ny_timezone = tz.gettz("America/New_York")

# UTC 시간을 뉴욕 타임존으로 변환
current_time_ny = current_time_utc.replace(
    tzinfo=utc_timezone).astimezone(ny_timezone)

print("Current Time (New York):", current_time_ny)  # Current Time (New York): 2024-02-22 22:23:31.356146-05:00

 

 

 

rrule: dateutil의 규칙 기반 날짜 생성 클래스

  • 규칙 기반으로 반복적인 날짜를 생성할 수 있는 도구
  • 예를 들어, 매주 특정 요일에 대한 반복적인 날짜를 쉽게 생성할 수 있다.
아래 코드는 2022년 1월 1일부터 시작해 매일 5번 생성하여 출력
from datetime import datetime
from dateutil.rrule import rrule, DAILY

# 시작 날짜
start_date = datetime(2022, 1, 1)

# 매일 반복하는 규칙 생성
daily_rule = rrule(DAILY, dtstart=start_date, count=5)

# 생성된 날짜 출력
for date in daily_rule:
    print(date.strftime('%Y-%m-%d'))
아래 코드는 시작 날짜부터 매주 수요일을 다섯 번 생성하여 출력
from datetime import datetime
from dateutil.rrule import rrule, WEEKLY, WE

# 매주 수요일 반복 규칙 생성
wednesdays = rrule(WEEKLY, byweekday=WE, dtstart=datetime(2024, 1, 1), count=5)
for date in wednesdays:
    print(date.strftime('%Y-%m-%d'))
아래 코드는 시작 날짜부터 매주 화요일만 5번 출력
from datetime import datetime
from dateutil.rrule import rrule, DAILY, TU

# 시작 날짜
start_date = datetime(2024, 2, 1)

# 매주 화요일만 반복하는 규칙 생성 (최대 5번)
weekly_rule = rrule(DAILY, dtstart=start_date, byweekday=(TU,), count=5)

# 생성된 날짜 출력
for date in weekly_rule:
    print(date.strftime('%Y-%m-%d'))

 

rrule 파라미터

  • freq : 반복 주기를 나타내는 파라미터로, SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY 등이 가능합니다.
  • dtstart: 반복이 시작하는 날짜와 시간을 나타냅니다.
  • interval: 주기적으로 반복되는 간격을 나타냅니다.
  • count: 생성할 날짜의 최대 수를 나타냅니다.
  • until: 반복이 끝나는 날짜와 시간을 나타냅니다.
  • bysetpos: 특정 주기만 선택하는데 사용되며, 음수로 지정하면 역순으로 선택됩니다.
  • byweekday: 반복이 일어나는 특정 요일을 나타내는 파라미터로, MO, TU, WE, TH, FR, SA, SU 등이 가능합니다.
  • bymonthday: 반복이 일어나는 특정 월 중 몇 번째 날짜인지를 나타내는 파라미터입니다.
  • byyearday: 반복이 일어나는 특정 해 중 몇 번째 날짜인지를 나타내는 파라미터입니다.
  • bymonth: 반복이 일어나는 특정 월을 나타내는 파라미터로, 1월부터 12월까지의 값을 사용합니다.
  • byeaster: 이스터 주일을 기준으로 하는 날짜를 나타내는 파라미터입니다.

 

rrule 함수의 실제 프로젝트 적용

  • 반복적인 이벤트나 스케줄을 관리하는 데 유용

1. 캘린더 애플리케이션

from datetime import datetime
from dateutil.rrule import rrule, WEEKLY, MO, FR

# 매주 월요일과 금요일 회의 설정
meeting_rule = rrule(WEEKLY, byweekday=(MO, FR), dtstart=datetime(2024, 1, 1), count=10)
meetings = list(meeting_rule)

 

2. 업무 일정 관리

from datetime import datetime
from dateutil.rrule import rrule, MONTHLY

# 매월 셋째 수요일 보고서 제출
report_rule = rrule(MONTHLY, byweekday=(2, 2), dtstart=datetime(2024, 1, 1), count=12)
reports_due = list(report_rule)

 

3. 데이터 분석 및 처리

from datetime import datetime
from dateutil.rrule import rrule, DAILY

# 매일 데이터 백업
backup_rule = rrule(DAILY, dtstart=datetime(2024, 1, 1), until=datetime(2024, 12, 31))
backups = list(backup_rule)

 

참고 링크

https://hangbok-archive.com/development/python/%ED%8C%8C%EC%9D%B4%EC%8D%AC-datetime-dateuti/

 

파이썬 datetime, dateutil : 생각보다 어려운 시간 다루기를 손쉽게 - H-A

파이썬에는 시간을 쉽게 다루게 해주는 라이브러리는 datetime, dateutil 이 있습니다. 단순히 시간을 표시해주는 기능 외에 연산, 변환 등의 기능을 가지고 있습니다. 두 라이브러리의 차이는 간단

hangbok-archive.com

 

'[업무 지식] > Python' 카테고리의 다른 글

[10분 판다스] python 기초  (0) 2024.10.31
[pandas 라이브러리] transform  (0) 2024.10.30
[Python Basic] 이상치 파헤치기  (0) 2024.10.30
[Python basic] 결측치 파헤치기  (0) 2024.10.30
[Python 기초] ②  (0) 2024.10.24