handOver2/data/db_to_json.py

112 lines
3.5 KiB
Python

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))