아미(아름다운미소)

주차를 일자로변경 본문

랭귀지/pandas

주차를 일자로변경

유키공 2025. 2. 25. 10:58
import pandas as pd
import numpy as np

def calculate_week_start(df, week_code_col, output_col='start_datetime'):
    """
    주차 코드를 시작일로 변환하는 함수 (성능 최적화 버전).

    Parameters:
        df (pd.DataFrame): 입력 데이터프레임
        week_code_col (str): 주차 코드 컬럼명 (예: "202401A")
        output_col (str): 결과 컬럼명 (기본값: "start_datetime")

    Returns:
        pd.DataFrame: 시작일이 추가된 데이터프레임
    """
    # 원본 데이터프레임 보존을 위해 복사
    df = df.copy()
    
    # 1. 년도와 주차 추출 (벡터화)
    years = df[week_code_col].str[:4].astype(int)
    weeks = df[week_code_col].str[4:6].astype(int)  # 주차 2자리 고정 (예: "01")
    
    # 2. 첫 번째 목요일 계산 (ISO 주차 표준)
    first_day = pd.to_datetime(years.astype(str) + '-01-01')
    first_thursday = first_day + pd.to_timedelta((3 - first_day.dt.weekday) % 7, unit='D')
    
    # 3. 첫 번째 주 시작일 계산 (월요일)
    start_week1 = first_thursday - pd.Timedelta(days=3)
    
    # 4. 해당 연도 마지막 주차 계산 (12월 28일 기준)
    dec28 = pd.to_datetime(years.astype(str) + '-12-28')
    last_week = dec28.dt.isocalendar().week
    
    # 5. 유효성 검사
    is_valid = weeks.between(1, last_week.values, inclusive='both')
    
    # 6. 시작일 계산 (벡터화)
    df[output_col] = pd.to_datetime(
        np.where(
            is_valid,
            (start_week1 + pd.to_timedelta((weeks - 1) * 7, unit='D')).values,
            pd.NaT
        )
    )
    
    return df
Comments