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/
'[업무 지식] > 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 |