본문 바로가기
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 다음으로 세상에서 제일 많이 오가는 데이터 포맷이야. 그리고 그걸 만지는 비용은 어김없이 세 군데서 청구돼: 타입 혼동, 숨은 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 가 걸려 넘어져.

규칙: 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 이 소리 없이 다른 숫자를 저장해 놨을 거야. 명시적 type 통제 없이 XLSX 를 읽는 downstream 파이프라인은 매번 바로 이걸 물려받는 거야.

Progress

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

댓글 0

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

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