1. 문제
프론트엔드에서 날짜를 선택하고 (단일, 범위 날짜 선택 가능)
백엔드에서 날짜에 맞는 데이터를 찾아서 보내주려고 하는데, 둘이 날짜가 맞지 않았다.
프론트엔드에서 보내는 날짜를 확인 해 보니, 로컬 시간대와 일치했지만
백엔드에서는 UTC로 변환하여 처리하고 있던게 문제인 것으로 확인했다.
2. 시간대 변환 코드
from datetime import datetime
import pytz
# 한국 표준시 설정
kst = pytz.timezone('Asia/Seoul')
# ISO 8601 형식의 UTC 데이터
utc_date = "2024-12-07T00:00:00Z"
# UTC 데이터를 KST로 변환
dt = datetime.fromisoformat(utc_date.replace("Z", "+00:00")).astimezone(kst)
print(dt) # 출력: 2024-12-07 09:00:00+09:00
변경된 데이터 문자열 출력
# 연-월-일 기준으로 데이터 비교
date_only = dt.date() # 날짜만 추출
print(date_only) # 출력: 2024-12-07
3. Pandas 날짜 비교 문제
선택된 날짜에 해당하는 데이터만 가져와야 하는 과제가 있는데
오늘이 아닌 날짜 기간을 선택하는 경우, 시간대가 00:00으로 고정되어서 선택한 범위 내 데이터가 모두 선택되었지만
오늘, 단일 날짜를 선택하는 경우 시간대가 선택한 시간으로 설정되고
데이터의 날짜는 시간 대를 저장하지 않아 00:00으로 인식하는 듯 하여
당일의 데이터를 가져오지 못하는 문제가 있었다.
이를 해결하기 위해 날짜를 받아 시간대를 변경한 후, 시간대는 버리는 방법으로 수정을 완료했다.
4. 전체 코드
from datetime import datetime
import pandas, json, pytz
kst = pytz.timezone('Asia/Seoul')
st, com = json.loads(standard), json.loads(compare)
standard_date = [datetime.fromisoformat(date.replace('Z', '+00:00')).astimezone(kst)
for date in st]
compare_date = [datetime.fromisoformat(date.replace('Z', '+00:00')).astimezone(kst)
for date in com]
st_start, st_end = standard_date[0].date(), standard_date[1].date()
com_start, com_end = compare_date[0].date(), compare_date[1].date()
def classify(date):
date = date.date()
if st_start <= date <= st_end:
return f"분석 기간: {st_start} ~ {st_end}"
elif com_start <= date <= com_end:
return f"비교 기간 : {com_start} ~ {com_end}"
else:
return None
data_set = pandas.read_excel(file)
data_set["날짜"] = pandas.to_datetime(data_set["날짜"])
data_set["기준"] = data_set["날짜"].apply(classify)
data_set.dropna(subset=["기준"], inplace=True)
'Backend > Python' 카테고리의 다른 글
[Python] Supabase 연결 오류 (0) | 2024.12.31 |
---|---|
[Python] 비트코인 자동매매 - 비동기 요청하기 (1) | 2024.06.18 |
[FastAPI] SQL Alchemy 연결 오류 해결 (0) | 2024.06.05 |
[Python] 비트코인 자동매매 - 백테스팅 (0) | 2024.05.15 |
[Python] 비트코인 자동매매 - 종목 선정 (0) | 2024.05.09 |