import pandas as pd import json def load_and_convert_excel(file_path, sheet_name, day_type): """ 엑셀 시트를 읽고 Long 형식으로 변환합니다. Args: file_path: 엑셀 파일 경로 sheet_name: 시트 이름 (weekday, saturday, sunday) day_type: 요일 구분 (평일, 토요일, 일요일/공휴일) Returns: 변환된 DataFrame """ # 엑셀 시트 읽기 df = pd.read_excel(file_path, sheet_name=sheet_name) # 불필요한 컬럼 제거 (Unnamed: 0, 기지, 열번.1) # 기지 컬럼은 역이 아니므로 제외 drop_cols = ['Unnamed: 0', '기지', '열번.1'] df = df.drop(columns=[col for col in drop_cols if col in df.columns], errors='ignore') # 고정할 컬럼 (메타 정보) id_vars = ['상하', '입출고', 'DIA', '열번'] # 역명 컬럼 (id_vars 이후 모든 컬럼) station_columns = [col for col in df.columns if col not in id_vars] # Wide to Long 변환 (Melt) df_long = pd.melt( df, id_vars=id_vars, value_vars=station_columns, var_name='역명', value_name='시간' ) # 시간 데이터가 없는 행(정차하지 않거나 데이터 없음) 제거 df_long = df_long.dropna(subset=['시간']) df_long = df_long[df_long['시간'].astype(str).str.strip() != ''] # 요일 구분 추가 df_long['요일구분'] = day_type # 입출고가 NaN인 경우 빈 문자열로 변환 df_long['입출고'] = df_long['입출고'].fillna('') # 데이터 타입 정리 df_long['DIA'] = df_long['DIA'].astype(int) df_long['열번'] = df_long['열번'].astype(int) return df_long def convert_dia_to_json(excel_path, output_path=None): """ dia.xlsx 파일의 모든 시트를 읽어 JSON으로 변환합니다. Args: excel_path: dia.xlsx 파일 경로 output_path: 저장할 JSON 파일 경로 (None이면 저장하지 않음) Returns: 변환된 전체 데이터 (list of dict) """ # 시트별 요일구분 매핑 sheet_mapping = { 'weekday': '평일', 'saturday': '토요일', 'sunday': '일요일/공휴일' } all_data = [] for sheet_name, day_type in sheet_mapping.items(): print(f"처리 중: {sheet_name} ({day_type})") df_long = load_and_convert_excel(excel_path, sheet_name, day_type) all_data.append(df_long) print(f" - {len(df_long)}개 레코드 변환 완료") # 모든 데이터 합치기 df_combined = pd.concat(all_data, ignore_index=True) # 컬럼 순서 정리 column_order = ['상하', '입출고', 'DIA', '열번', '역명', '시간', '요일구분'] df_combined = df_combined[column_order] # JSON 변환 json_data = df_combined.to_dict(orient='records') # 파일 저장 if output_path: with open(output_path, 'w', encoding='utf-8') as f: json.dump(json_data, f, ensure_ascii=False, indent=4) print(f"\nJSON 파일 저장 완료: {output_path}") print(f"총 {len(json_data)}개 레코드") return json_data if __name__ == "__main__": # 실행 excel_file = "dia.xlsx" output_file = "dia_data.json" result = convert_dia_to_json(excel_file, output_file) # 결과 샘플 출력 print("\n=== 변환 결과 샘플 (처음 5개) ===") print(json.dumps(result[:5], ensure_ascii=False, indent=4))