C.W.K.
Stream
Lesson 02 of 06 · published

Excel — 타입 혼동 세금

~9 min · excel, format, gotcha

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

Excel 은 CSV 다음으로 세계에서 가장 많이 ship 되는 데이터 포맷이고, 만지는 비용은 항상 세 곳에서 나타나: 타입 혼동, 숨은 state, round-trip drift.

타입 혼동

Excel 은 파일 열거나 paste 할 때 type 을 auto-detect. 한번 detect 되면 type 이 cell 에 저장돼 — 즉 CSV 를 Excel 로 열고 다시 저장하는 게 값을 영구히 바꿀 수 있어. 고전 범죄자들:

  • 앞 0 사라짐 (00123 ZIP → 123).
  • 긴 ID 가 과학 표기로 (12345678901234561.23457E+15, 마지막 자리 손실).
  • 유전자 이름이 날짜로 파싱 (MARCH11-Mar).
  • 분수처럼 보이는 string 이 분수로 (1/20.5).

숨은 state

Excel 파일은 셀 값만이 아니야. 수식, 조건부 서식, 명명된 범위, 숨은 column, autofilter, 댓글, 변경 추적, 임베드 객체, 매크로. openpyxl 이나 pandas 로 XLSX 읽으면 그 대부분을 무시 — 괜찮지만, 본인이 읽는 파일이 사람이 보는 파일이 아니란 의미.

Round-trip drift

같은 파일을 편집 없이 읽고 쓰기만 해도 수식 평가 순서, locale 별 구분자, float 표현이 작은 diff 만들어서 git commit 망치고 downstream consumer 걸려.

규칙: 파이프라인 boundary 에서 (사람이 줄 때) 만 Excel 읽고 즉시 Parquet 으로 변환. Excel 을 절대 파이프라인 stage 로 만들지 마 — 입력 또는 출력으로만.

Code

Excel 안전하게 읽고 Parquet 으로 변환 후 XLSX 잊기·python
import pandas as pd

df = pd.read_excel(
    'sales_q1.xlsx',
    sheet_name='Q1',
    dtype=str,
    keep_default_na=False,
    engine='openpyxl',          # 명시적; default 는 확장자에 따라 다름
)

# 의도적 cast
df['amount_usd'] = pd.to_numeric(df['amount_usd'].str.replace(',', ''), errors='raise')
df['order_date'] = pd.to_datetime(df['order_date'], errors='raise')

# Parquet 으로 — 그리고 이제부터 Parquet 만 써
df.to_parquet('sales_q1.parquet', index=False, compression='zstd')

External links

Exercise

Excel 열어. 셀에 1234567890123456 입력. Enter. 셀 다시 읽어. Excel 이 조용히 다른 숫자 저장한 거 알아채. 본인 downstream 파이프라인이 명시 type 통제 없이 XLSX 읽을 때마다 상속하는 게 이거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.