Skip to main content

문자열과 날짜

실무 데이터에는 이름, 주소, 이메일 같은 문자열 데이터와 날짜/시간 데이터가 빈번하게 등장합니다. Pandas의 .str 접근자와 dt 접근자를 활용하면 이러한 데이터를 벡터화된 방식으로 효율적으로 처리할 수 있습니다.

학습 목표

  • .str 접근자로 문자열 데이터를 벡터화 처리할 수 있다
  • to_datetime으로 다양한 형식의 날짜 문자열을 변환할 수 있다
  • dt 접근자로 날짜 구성 요소(연, 월, 일, 요일 등)를 추출할 수 있다

왜 중요한가

텍스트 데이터에서 패턴을 추출하거나, 날짜 데이터에서 시간적 특성(요일, 월, 분기)을 피처로 만드는 것은 피처 엔지니어링의 핵심입니다. 반복문 대신 벡터화된 문자열/날짜 연산을 사용하면 처리 속도가 수십 배 빨라집니다.

.str 접근자 — 문자열 처리

import pandas as pd

names = pd.Series(['  Kim Chulsoo  ', 'lee younghee', 'PARK MINSOO'])

# 공백 제거와 대소문자 변환
print(names.str.strip())         # 앞뒤 공백 제거
print(names.str.lower())         # 소문자 변환
print(names.str.upper())         # 대문자 변환
print(names.str.title())         # 각 단어 첫 글자 대문자

# 포함 여부
emails = pd.Series(['user@gmail.com', 'admin@naver.com', 'test@gmail.com'])
print(emails.str.contains('gmail'))  # [True, False, True]

# 분할
print(emails.str.split('@'))           # 리스트로 분할
print(emails.str.split('@').str[1])    # 도메인 부분만

# 추출 (정규표현식)
print(emails.str.extract(r'@(\w+)\.'))  # 도메인 이름만

# 교체
print(emails.str.replace('gmail', 'google', regex=False))

# 길이
print(names.str.len())

자주 쓰는 .str 메서드

메서드설명예시
.str.strip()공백 제거데이터 정제
.str.lower()소문자 변환텍스트 정규화
.str.contains()패턴 포함 여부필터링
.str.startswith()접두사 확인분류
.str.split()분할파싱
.str.extract()정규표현식 추출패턴 매칭
.str.replace()교체정제
.str.pad()패딩코드 포맷
.str.slice()부분 문자열고정 위치 추출

to_datetime — 날짜 변환

# 다양한 형식의 날짜 문자열
dates = pd.Series(['2024-01-15', '2024/02/20', '15-Mar-2024', '20240401'])

# 자동 파싱
dt = pd.to_datetime(dates)
print(dt)

# 형식 지정 (더 빠름)
dates2 = pd.Series(['15/01/2024', '20/02/2024', '25/03/2024'])
dt2 = pd.to_datetime(dates2, format='%d/%m/%Y')

# 오류 처리
mixed = pd.Series(['2024-01-15', 'invalid', '2024-03-20'])
dt3 = pd.to_datetime(mixed, errors='coerce')  # 변환 불가 → NaT
print(dt3)
# 0   2024-01-15
# 1          NaT
# 2   2024-03-20

dt 접근자 — 날짜 구성 요소 추출

df = pd.DataFrame({
    'order_date': pd.to_datetime(['2024-01-15', '2024-03-20',
                                   '2024-07-04', '2024-12-25'])
})

# 연, 월, 일 추출
df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['day'] = df['order_date'].dt.day

# 요일 (0=월요일, 6=일요일)
df['weekday'] = df['order_date'].dt.dayofweek
df['weekday_name'] = df['order_date'].dt.day_name()

# 분기
df['quarter'] = df['order_date'].dt.quarter

# 주차
df['week'] = df['order_date'].dt.isocalendar().week

# 날짜 차이
df['days_from_today'] = (pd.Timestamp.now() - df['order_date']).dt.days
속성설명반환값
.dt.year연도정수
.dt.month1~12
.dt.day1~31
.dt.dayofweek요일0(월)~6(일)
.dt.quarter분기1~4
.dt.hour0~23
.dt.date날짜만date 객체
.dt.time시간만time 객체

AI/ML에서의 활용

  • 텍스트 피처: 이메일 도메인, 이름 길이, 특정 키워드 포함 여부를 피처로 만듭니다
  • 시간 피처: 요일, 월, 분기, 공휴일 여부 등을 피처로 추출합니다
  • 데이터 정제: 공백 제거, 대소문자 통일로 범주형 데이터의 일관성을 확보합니다
  • 시계열 분할: 날짜 기반으로 학습/검증 데이터를 시간순으로 분할합니다
형식을 지정하지 않으면 Pandas가 여러 형식을 시도하며 자동 파싱합니다. 형식을 명시하면 한 번의 파싱으로 끝나므로 대용량 데이터에서 수배 빠릅니다.
NaT(Not a Time)는 날짜/시간의 결측치입니다. 숫자의 NaN에 해당하며, pd.isna()로 탐지할 수 있습니다.

체크리스트

  • .str 접근자로 문자열 정제(strip, lower, replace)를 수행할 수 있다
  • .str.contains()와 .str.extract()로 패턴 필터링/추출을 할 수 있다
  • to_datetime으로 문자열을 날짜로 변환할 수 있다
  • dt 접근자로 연, 월, 일, 요일 등을 추출할 수 있다
  • 날짜 차이를 계산할 수 있다

다음 문서