이전 글을 활용해서 https://all-share-source-code.tistory.com/87 날짜 비교 함수 까지 만들어 보았습니다.
from datetime import datetime
# 날짜 변환 함수(문자열 특정 포맷 날짜로 변환)
def trans_date(date: (datetime | str), toFormat: str = "%Y-%m-%d", transFormat: (str | bool) = "%Y-%m-%d", exception: list = []) -> (datetime | str | dict):
r'''
date : 날짜입력 (datetime, 문자열 형태로 입력)
toFormat :
str타입 -> 문자열의 날짜형식에 맞게 입력
datetime타입 -> 원하는 문자열날짜 형태로 출력할 형식으로 입력
transFormat : 변환할 날짜 형식
exception : 예외처리할 값들
@return값 :
date : 입력값
returnDATE :
'toFormat' -> date값 변환 되서 나옴
'transFormat' -> transFormat매개변수로 변환된 값 ('str', 'datetime')
'''
if date in exception:
return ''
returnDATE: dict[str, (str | dict[str, (str, datetime)])] = {
'toFormat': None,
'transFormat': {'str': None, 'datetime': None},
}
# 문자열일 경우
if isinstance(date, str):
returnDATE['toFormat'] = datetime.strptime(date, toFormat)
if transFormat:
returnDATE['transFormat']['str'] = returnDATE['toFormat'].strftime(transFormat)
returnDATE['transFormat']['datetime'] = datetime.strptime(returnDATE['transFormat']['str'], transFormat)
# 날짜 형식 일경우
elif isinstance(date, datetime):
returnDATE['toFormat'] = date.strftime(toFormat)
if transFormat:
returnDATE['transFormat']['str'] = date.strftime(transFormat)
returnDATE['transFormat']['datetime'] = datetime.strptime(returnDATE['transFormat']['str'], transFormat)
# if not pd.notna(date):
# return 'N/A'
if not transFormat:
del returnDATE['transFormat']
return returnDATE
# 날짜 비교 함수
def date_compare(leftDate=None, targetDate: (datetime | list) = [], rightDate=None, compare='<=', formatString="%H:%M"):
r'''
leftDate : 비교할 왼쪽 날짜
targetDate : 비교할 날짜
datetime형식 일경우 -> datetime.datetime(2021, 8, 31, 15, 0)
문자열형식 일경우 -> ['날짜 문자열','날짜 형식'] 예) ['2021-08-31 15:00:00', '%Y-%m-%d %H:%M:%S']
rightDate : 비교할 오른쪽 날짜
compare : 비교 연산자
formatString : 비교 날짜 형식
'''
import datetime
if not targetDate:
print('타겟 날짜가 없습니다.')
return False
elif isinstance(targetDate, str):
print('리스트 형태로 문자열 날짜와 날짜형식을 입력해주세요.')
return False
if isinstance(targetDate, list):
targetDate = trans_date(targetDate[0], targetDate[1], formatString)['transFormat']['datetime']
elif isinstance(targetDate, datetime.datetime):
targetDate = trans_date(targetDate, formatString, formatString)['transFormat']['datetime']
code: str = ''
if leftDate is not None:
code += f"{trans_date(leftDate, formatString, formatString)['transFormat']['datetime'].__repr__()}{compare}"
code += targetDate.__repr__()
if rightDate is not None:
code += f"{compare}{trans_date(rightDate, formatString, formatString)['transFormat']['datetime'].__repr__()}"
# print(code)
if not code:
return False
try:
return eval(code)
except:
return eval(code.replace('datetime.', ''))
dateTime = "2023-12-12 17:59:25"
# 6:00 > 3:00
print(date_compare('6:00', ['03:00', "%H:%M"], compare='>'))
# 4:00 <= 3:00 <= 10:00
print(date_compare('04:00', ['03:00', "%H:%M"], '10:00', compare='<='))
# 17시 == (2023-12-12 17:59:25 -> 17시)
print(date_compare('17', ["2023-12-12 17:59:25", "%Y-%m-%d %H:%M:%S"], compare='==', formatString="%H"))
# 4:00 >= 2023-12-12 17:59:25 >= 10:00
print(date_compare('04:00', ["2023-12-12 17:59:25", "%Y-%m-%d %H:%M:%S"], '10:00', compare='>='))
dateTime = datetime(2022, 12, 12, 17, 59, 25)
# 04:00 >= 17:59 >= 10:00
print(date_compare('04:00', dateTime, '10:00', compare='>='))
# 59 25 == (2022-12-12 17:59:25 -> 59 25)
print(date_compare('59 25', dateTime, compare='==', formatString="%M %S"))
# 17:59:25 > 3:00:30
print(date_compare(targetDate=dateTime, rightDate='3:00:30', compare='>', formatString="%H:%M:%S"))
# 2022/10/01 <= 2022/12/12 <= 2023/04/05
print(date_compare('2022/10/01', dateTime, '2023/04/05', compare='<=', formatString="%Y/%m/%d"))
결과