본문으로 건너뛰기

pandas 100제: 판다스 연습문제와 풀이 · 8장

061–070 문자열과 날짜

str.strip, lower, replace, split, len, startswith, to_datetime, dt 연·월·요일, 날짜 차이, 월별 집계 연습문제

9분 읽기

이 장의 목차 13개

문자열 열은 .str, 날짜 열은 .dt로 다룹니다. 준비 코드의 고객 이름에는 공백과 대소문자가 섞여 있습니다.

.str 메서드를 이어 쓰는 흐름과 날짜에서 .dt로 꺼내는 값
.str 메서드를 이어 쓰는 흐름과 날짜에서 .dt로 꺼내는 값

문자열 열에는 .str, 날짜 열에는 .dt를 붙이면 파이썬 문자열·날짜 메서드를 열의 모든 값에 한꺼번에 적용할 수 있습니다. 단, 글자로 된 날짜("2026-02-03")는 먼저 pd.to_datetime으로 날짜형(Timestamp)으로 바꿔야 .dt를 쓸 수 있습니다.

준비 코드와 데이터

노트북 첫 셀에 아래 준비 코드를 붙여 넣어 실행한 뒤 문제를 푸세요.

Pythonimport pandas as pd

orders = pd.DataFrame({
    'customer': ['  Kim ', 'lee', 'PARK', 'Choi  ', 'kim'],
    'email': ['kim@naver.com', 'lee@gmail.com', 'park@daum.net', 'choi@gmail.com', 'kim2@naver.com'],
    'phone': ['010-1234-5678', '010-2222-3333', '010-9876-5432', '010-5555-0000', '010-1111-2222'],
    'order_date': ['2026-01-15', '2026-01-28', '2026-02-03', '2026-02-17', '2026-03-09'],
    'amount': [32000, 15000, 47000, 22000, 18000],
})

이 장 실습 노트북 내려받기 (.ipynb) — 준비 코드와 문제가 들어 있고 답 칸은 비어 있습니다. 코랩에서는 파일 → 노트 업로드로 엽니다.

준비 코드를 실행하면 orders는 다음 표가 됩니다(5행 × 5열, 맨 왼쪽 숫자는 인덱스).

결과  customer           email          phone  order_date  amount
0     Kim    kim@naver.com  010-1234-5678  2026-01-15   32000
1      lee   lee@gmail.com  010-2222-3333  2026-01-28   15000
2     PARK   park@daum.net  010-9876-5432  2026-02-03   47000
3   Choi    choi@gmail.com  010-5555-0000  2026-02-17   22000
4      kim  kim2@naver.com  010-1111-2222  2026-03-09   18000

장 안의 문제는 번호 순서대로 이어집니다. 앞 문제에서 만든 열이나 변수를 다음 문제가 쓸 수 있으니, 중간부터 풀 때는 준비 코드와 앞의 필요한 문제를 먼저 실행하세요.

061. 공백 지우고 소문자로

customer의 앞뒤 공백을 지우고 소문자로 바꾸세요.

힌트 보기

.str.strip()과 .str.lower()를 이어 씁니다.

정답 보기
Pythonorders['customer'].str.strip().str.lower()
결과0     kim
1     lee
2    park
3    choi
4     kim
Name: customer, dtype: str

풀이: strip은 양 끝 공백만 제거하고 lower는 대문자를 소문자로 바꿉니다. 중간 공백은 남습니다.

pandas 2.x에서는 마지막 줄이 dtype: object로 보입니다. 값은 같습니다.

062. 글자 바꾸기

phone의 하이픈(-)을 모두 지우세요.

힌트 보기

.str.replace("-", "").

정답 보기
Pythonorders['phone'].str.replace('-', '')
결과0    01012345678
1    01022223333
2    01098765432
3    01055550000
4    01011112222
Name: phone, dtype: str

풀이: replace 결과는 새 Series입니다. 원본 전화번호 열을 바꾸려면 다시 대입해야 합니다.

pandas 2.x에서는 마지막 줄이 dtype: object로 보입니다. 값은 같습니다.

063. 문자열 나누기

email에서 @ 뒤의 도메인만 꺼내세요.

힌트 보기

.str.split("@")로 나눈 뒤 .str[1]로 두 번째 조각을 꺼냅니다.

정답 보기
Pythonorders['email'].str.split('@').str[1]
결과0    naver.com
1    gmail.com
2     daum.net
3    gmail.com
4    naver.com
Name: email, dtype: object

풀이: @로 나눈 리스트의 두 번째 요소를 선택합니다. 잘못된 이메일 형식 검증은 별도 작업입니다.

064. 글자 수

email의 글자 수를 구하세요.

힌트 보기

.str.len().

정답 보기
Pythonorders['email'].str.len()
결과0    13
1    13
2    13
3    14
4    14
Name: email, dtype: int64

풀이: str.len은 행마다 문자열 길이를 반환합니다. Series의 행 수를 구하는 len과 다릅니다.

065. 특정 글자로 시작

이메일이 kim으로 시작하는 주문을 고르세요.

힌트 보기

.str.startswith("kim")으로 만든 조건으로 거릅니다.

정답 보기
Pythonorders[orders['email'].str.startswith('kim')]
결과  customer           email          phone  order_date  amount
0     Kim    kim@naver.com  010-1234-5678  2026-01-15   32000
4      kim  kim2@naver.com  010-1111-2222  2026-03-09   18000

풀이: startswith는 문자열 시작 부분을 검사합니다. 이 데이터는 이메일 결측치가 없지만 있다면 na=False를 정할 수 있습니다.

066. 날짜형으로 바꾸기

order_date를 날짜형으로 바꾸고 자료형을 확인하세요.

힌트 보기

pd.to_datetime(열)의 결과를 같은 열에 다시 대입해야 표가 바뀝니다.

정답 보기
Pythonorders['order_date'] = pd.to_datetime(orders['order_date'])
orders.dtypes
결과customer                 str
email                    str
phone                    str
order_date    datetime64[us]
amount                 int64
dtype: object

풀이: datetime으로 변환해야 다음 문항에서 dt 접근자를 사용할 수 있습니다.

pandas 2.x에서는 값은 같고 표시만 다음과 같습니다.

결과customer              object
email                 object
phone                 object
order_date    datetime64[ns]
amount                 int64
dtype: object

067. 월·요일 꺼내기

날짜에서 월(month)과 요일(weekday) 열을 만드세요.

힌트 보기

날짜 열에는 .dt를 붙입니다. 월은 .dt.month, 요일 이름은 .dt.day_name().

정답 보기
Pythonorders['month'] = orders['order_date'].dt.month
orders['weekday'] = orders['order_date'].dt.day_name()
orders[['order_date', 'month', 'weekday']]
결과  order_date  month    weekday
0 2026-01-15      1   Thursday
1 2026-01-28      1  Wednesday
2 2026-02-03      2    Tuesday
3 2026-02-17      2    Tuesday
4 2026-03-09      3     Monday

풀이: month는 숫자, day_name은 요일 이름을 반환합니다. 준비 코드의 날짜와 행 순서를 유지합니다.

068. 날짜 차이

각 주문이 2026-03-31로부터 며칠 전인지 구하세요.

힌트 보기

pd.Timestamp("2026-03-31")에서 날짜 열을 빼면 기간(Timedelta)이 됩니다. 일수는 .dt.days.

정답 보기
Python(pd.Timestamp('2026-03-31') - orders['order_date']).dt.days
결과0    75
1    62
2    56
3    42
4    22
Name: order_date, dtype: int64

풀이: 기준 날짜에서 주문 날짜를 빼 Timedelta를 구하고 days로 정수 일수를 꺼냅니다.

069. 기간으로 거르기

2026년 2월에 들어온 주문만 고르세요.

힌트 보기

날짜형 열에도 between("2026-02-01", "2026-02-28")을 쓸 수 있습니다.

정답 보기
Pythonorders[orders['order_date'].between('2026-02-01', '2026-02-28')]
결과  customer           email          phone order_date  amount  month  weekday
2     PARK   park@daum.net  010-9876-5432 2026-02-03   47000      2  Tuesday
3   Choi    choi@gmail.com  010-5555-0000 2026-02-17   22000      2  Tuesday

풀이: 여기 날짜는 시각 없는 자정 값입니다. 실제 타임스탬프는 3월 1일 미만 조건으로 2월 말 하루 전체를 포함시키는 편이 명확합니다.

070. 월별 합계

월별 주문 금액 합계를 구하세요.

힌트 보기

groupby() 괄호 안에 날짜열.dt.to_period("M")을 넣습니다.

정답 보기
Pythonorders.groupby(orders['order_date'].dt.to_period('M'))['amount'].sum()
결과order_date
2026-01    47000
2026-02    69000
2026-03    18000
Freq: M, Name: amount, dtype: int64

풀이: 연-월 Period로 묶어 다른 해의 같은 달이 합쳐지는 것을 방지합니다.

to_period("M")는 날짜를 연-월 단위로 묶습니다.

이 장 요약

문법하는 일문제
s.str.strip() / .str.lower()앞뒤 공백 제거 / 소문자061
s.str.replace("-", "")글자 바꾸기062
s.str.split("@").str[1]나눠서 n번째 조각063
s.str.len() / .str.startswith()글자 수 / 시작 글자 검사064–065
pd.to_datetime(s)날짜형으로 변환066
s.dt.month / .dt.day_name()월 / 요일 이름067
(날짜1 - 날짜2).dt.days날짜 차이(일)068
s.dt.to_period("M")연-월 단위로 묶기070

이 장의 점검

문자열을 정리한 결과를 원본에 저장했는지 구분하세요. 날짜 조건은 시각이 있는 데이터까지 포함하는지도 따로 확인합니다.

참고: pandas 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.

전체 메뉴