pandas 100제: 판다스 연습문제와 풀이 · 8장
061–070 문자열과 날짜
str.strip, lower, replace, split, len, startswith, to_datetime, dt 연·월·요일, 날짜 차이, 월별 집계 연습문제
이 장의 목차 13개
문자열 열은 .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: object067. 월·요일 꺼내기
날짜에서 월(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 공식 문서 · 문법이 기억나지 않으면 부록 치트시트를 찾아보세요.