112 lines
3.5 KiB
Python
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))
|