0Pricing
Pandas & NumPy Academy · 강의

날짜 올바르게 파싱하기

날짜 문자열을 pd.to_datetime으로 datetime64로 파싱하고, 여러 형식을 처리하며 DatetimeIndex를 설정합니다.

날짜 올바르게 파싱하기은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

날짜 파싱이 중요한 이유

날짜 및 시간 데이터는 실제 데이터세트에서 매우 흔합니다. 거래 시각, 생년월일, 이벤트 기록, 금융 기간 등이 그 예입니다. 날짜가 문자열(object dtype)로 저장되어 있으면 기간을 계산하거나 월별로 리샘플링하거나 시간순으로 정렬할 수 없습니다. 문자열을 Pandas의 datetime64 dtype으로 변환하면 전체 시계열 API를 사용할 수 있고 시간 기반 분석이 가능해집니다.

import pandas as pd

df = pd.DataFrame({'date': ['2024-01-15', '2024-03-20', '2024-07-04']})
print(df['date'].dtype)  # object

# You cannot do arithmetic on string dates
# df['date'] + pd.Timedelta('1 day')  # TypeError!

# After parsing:
df['date'] = pd.to_datetime(df['date'])
print(df['date'].dtype)        # datetime64[ns]
print(df['date'] + pd.Timedelta('1 day'))

pd.to_datetime() 기초

pd.to_datetime(series)는 문자열 열을 datetime64로 변환하는 기본 함수입니다. 형식 문자열을 지정하지 않아도 대부분의 일반적인 날짜 형식(ISO 8601, 미국식 날짜, 유럽식 날짜)을 자동으로 인식할 만큼 똑똑합니다. 결과는 dtype이 datetime64[ns]인 Series이며, 나노초 정밀도로 1677년부터 2262년까지의 시각을 저장할 수 있습니다.

import pandas as pd

dates = pd.Series([
    '2024-01-15',
    '15/01/2024',
    'January 15, 2024',
    '2024-01-15 08:30:00'
])

parsed = pd.to_datetime(dates)
print(parsed)
# 0   2024-01-15 00:00:00
# 1   2024-01-15 00:00:00
# 2   2024-01-15 00:00:00
# 3   2024-01-15 08:30:00
print(parsed.dtype)  # datetime64[ns]

format= 인수 지정

자동 추론이 너무 느리거나 모호할 때(예: '01-02-03'은 2003년 1월 2일, 2003년 2월 1일 또는 2001년 2월 3일을 의미할 수 있음)는 Python의 strftime 코드를 사용하여 정확한 형식 문자열을 제공하세요. 이 방법은 훨씬 빠르기도 합니다. 대규모 데이터세트에서는 Pandas가 여러 패턴을 시도할 필요가 없으므로 명시적 형식 파싱이 자동 추론보다 최대 10배 빠를 수 있습니다.

import pandas as pd

dates = pd.Series(['15/01/2024', '20/03/2024', '04/07/2024'])

# Explicit format: day/month/year
parsed = pd.to_datetime(dates, format='%d/%m/%Y')
print(parsed)
# 0   2024-01-15
# 1   2024-03-20
# 2   2024-07-04

# Common format codes:
# %Y = 4-digit year, %y = 2-digit year
# %m = month (01-12), %d = day (01-31)
# %H = hour (0-23), %M = minute, %S = second

잘못된 날짜에 errors='coerce' 사용

실제 데이터세트의 날짜 열에는 오타나 'TBD', 'N/A', '99/99/9999' 같은 자리 표시자 문자열이 포함되는 경우가 많습니다. errors='coerce'를 pd.to_datetime()에 전달하면 파싱할 수 없는 값을 예외를 발생시키는 대신 NaT(Not a Time, 즉 NaN에 해당하는 datetime 값)로 변환합니다. 이를 통해 잘못된 날짜를 별도로 식별하고 처리할 수 있습니다.

import pandas as pd

dates = pd.Series(['2024-01-15', 'TBD', '2024-07-04', 'N/A'])

parsed = pd.to_datetime(dates, errors='coerce')
print(parsed)
# 0   2024-01-15
# 1          NaT
# 2   2024-07-04
# 3          NaT

# Detect bad dates
print('Bad date rows:', parsed.isna().sum())  # 2

read_csv()의 parse_dates

날짜를 파싱하기에 가장 효율적인 시점은 pd.read_csv()의 parse_dates 매개변수를 사용하는 로드 시점입니다. 날짜로 파싱해야 하는 열 이름(또는 인덱스)의 목록을 전달하세요. 이렇게 하면 별도의 후처리 단계가 필요 없으며, Pandas가 C 수준의 CSV 파싱 중에 처리하므로 더 빠른 경우가 많습니다.

import pandas as pd
import io

csv_data = '''order_id,order_date,ship_date
1,2024-01-15,2024-01-18
2,2024-02-20,2024-02-22
'''

df = pd.read_csv(
    io.StringIO(csv_data),
    parse_dates=['order_date', 'ship_date']
)
print(df.dtypes)
# order_id      int64
# order_date    datetime64[ns]
# ship_date     datetime64[ns]

날짜 구성 요소를 위한 .dt 접근자

열의 dtype이 datetime64가 되면 .dt 접근자를 통해 수십 가지 속성과 메서드를 사용할 수 있습니다. .dt.year, .dt.month, .dt.day, .dt.hour, .dt.dayofweek(0=월요일), .dt.is_month_end 등을 추출할 수 있습니다. 이러한 기능은 시계열 예측을 위한 특성 공학과 기간별 데이터 그룹화에 사용됩니다.

import pandas as pd

df = pd.DataFrame({
    'event_time': pd.to_datetime([
        '2024-03-15 08:30:00',
        '2024-07-04 14:00:00',
        '2024-12-25 09:00:00'
    ])
})

df['year'] = df['event_time'].dt.year
df['month'] = df['event_time'].dt.month
df['day_of_week'] = df['event_time'].dt.day_name()
df['hour'] = df['event_time'].dt.hour
print(df[['year', 'month', 'day_of_week', 'hour']])

DatetimeIndex 설정

시계열 분석에서는 날짜 및 시간 열을 DataFrame의 인덱스로 설정하는 것이 일반적입니다. DatetimeIndex를 사용하면 시간 기반 슬라이싱(df['2024'], df['2024-01':'2024-06']), 임의의 빈도로 리샘플링, Pandas의 전체 시계열 API 사용이 가능합니다. set_index()를 사용하거나 read_csv에서 index_col을 전달하세요.

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03']),
    'temp': [22.5, 23.0, 21.8]
})

df = df.set_index('date')
print(df)
#             temp
# date
# 2024-01-01  22.5
# 2024-01-02  23.0
# 2024-01-03  21.8

# Time-based slicing
print(df['2024-01-02':'2024-01-03'])

여러 날짜 형식 처리

날짜 열에 여러 형식이 섞여 있으면(예: 일부 행에는 ISO 날짜가 있고 다른 행에는 미국식 날짜가 있음) 하나의 형식 문자열을 지정할 수 없습니다. 행마다 형식을 감지하도록 format='mixed'(Pandas 2.0 이상)를 전달하거나, pd.to_datetime()을 호출하기 전에 정규 표현식으로 열을 사전 정리하여 모든 날짜를 하나의 형식으로 통일하세요.

import pandas as pd

mixed_dates = pd.Series([
    '2024-01-15',
    '03/20/2024',
    '2024-07-04T10:30:00'
])

# format='mixed' handles different formats row-by-row (Pandas >= 2.0)
parsed = pd.to_datetime(mixed_dates, format='mixed')
print(parsed)
# 0   2024-01-15 00:00:00
# 1   2024-03-20 00:00:00
# 2   2024-07-04 10:30:00

시간대 정보를 포함한 datetime

실제 시각 데이터에는 시간대 정보가 포함되는 경우가 많습니다. pd.to_datetime()은 UTC 오프셋 문자열(예: '2024-01-15 08:30:00+05:30')을 파싱하여 시간대 정보가 포함된 datetime64로 저장할 수 있습니다. 모든 시각을 올바르게 비교하고 계산하려면 .dt.tz_convert('UTC')를 사용하여 공통 시간대로 정규화하세요.

import pandas as pd

dates = pd.to_datetime(['2024-01-15 08:30:00+05:30', '2024-01-15 10:00:00-08:00'])
print(dates)
# DatetimeIndex(['2024-01-15 08:30:00+05:30', '2024-01-15 10:00:00-08:00'])

# Convert both to UTC for fair comparison
utc_dates = dates.tz_convert('UTC')
print(utc_dates)
# DatetimeIndex(['2024-01-15 03:00:00+00:00', '2024-01-15 18:00:00+00:00'])

날짜 차이 계산

두 datetime64 열 사이의 산술 연산은 Timedelta Series를 생성합니다. .dt.days, .dt.seconds, .dt.total_seconds() 속성을 사용하여 Timedelta에서 일, 시간 또는 초의 수를 추출할 수 있습니다. 이는 나이, 기간 또는 마지막 이벤트 이후 경과 일수 특성을 계산하는 표준 방법입니다.

import pandas as pd

df = pd.DataFrame({
    'start': pd.to_datetime(['2024-01-01', '2024-03-10', '2024-06-15']),
    'end': pd.to_datetime(['2024-01-20', '2024-04-05', '2024-06-30'])
})

df['duration_days'] = (df['end'] - df['start']).dt.days
print(df[['start', 'end', 'duration_days']])
#        start        end  duration_days
# 0 2024-01-01 2024-01-20             19
# 1 2024-03-10 2024-04-05             26
# 2 2024-06-15 2024-06-30             15

날짜 생성을 위한 pd.date_range()

pd.date_range(start, end, freq=)는 일정한 간격의 날짜 시퀀스를 DatetimeIndex로 생성합니다. 이는 데이터를 다시 인덱싱할 완전한 시간 축을 만드는 데 유용합니다. 이벤트가 없었던 날이라도 모든 달력 기간이 출력에 나타나도록 할 수 있습니다. 일반적인 freq 값은 다음과 같습니다. 'D'(매일), 'ME'(월말), 'h'(매시간).

import pandas as pd

# Weekly dates for the first quarter of 2024
weekly = pd.date_range(start='2024-01-01', end='2024-03-31', freq='W')
print(weekly[:5])
# DatetimeIndex(['2024-01-07', '2024-01-14', '2024-01-21', '2024-01-28', '2024-02-04'])

# Monthly date spine
monthly = pd.date_range(start='2024-01', periods=12, freq='ME')
print(len(monthly), monthly[0], monthly[-1])
# 12 2024-01-31 2024-12-31

빠른 확인

Pandas에서 날짜를 올바르게 파싱하는 방법에 대한 이해도를 확인해 보세요.

레슨 요약

이 레슨에서는 다음을 배웠습니다. pd.to_datetime()은 문자열 열을 datetime64로 변환하고, format=은 속도와 정확도를 위해 정확한 패턴을 지정하며, errors='coerce'는 잘못된 날짜를 오류를 발생시키는 대신 NaT로 변환합니다. .dt 접근자는 연도, 월, 일 및 기타 구성 요소를 추출하며, DatetimeIndex를 설정하면 시간 기반 슬라이싱을 사용할 수 있습니다. 다음에는 벡터화된 문자열 연산을 위한 .str 접근자를 살펴봅니다.

자주 묻는 질문

“날짜 올바르게 파싱하기” 강의는 무료인가요?

네 — “날짜 올바르게 파싱하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“날짜 올바르게 파싱하기”에서 뭘 배우나요?

날짜 문자열을 pd.to_datetime으로 datetime64로 파싱하고, 여러 형식을 처리하며 DatetimeIndex를 설정합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“날짜 올바르게 파싱하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 열 데이터 형식 확인하기
  2. astype()으로 형 변환하기
  3. 범주형 데이터 형식
  4. 날짜 올바르게 파싱하기
← Pandas & NumPy Academy(으)로 돌아가기