0Pricing
Pandas & NumPy Academy · 강의

시간 특성 추출하기

.dt 접근자를 사용해 날짜시간 열에서 연도, 월, 일, 요일, 시간을 추출하여 특성을 만듭니다.

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

시간 특성을 추출하는 이유

가공하지 않은 datetime64 열은 대부분의 머신러닝 알고리즘이 이해하기 어렵습니다. 알고리즘은 2024-12-25가 공휴일이라는 사실이나 Friday가 소매 판매 증가를 유발한다는 사실을 알 수 없습니다. 시간 특성 공학은 datetime 열에서 연도, 월, 일, 요일, 시간과 같은 의미 있는 구성 요소를 추출해 별도의 숫자형 또는 범주형 열로 만듭니다. 그러면 모델과 분석 함수가 이를 직접 사용할 수 있습니다.

.dt 접근자

DataFrame 열의 자료형이 datetime64이면 .dt 접근자를 통해 모든 datetime 속성과 메서드에 벡터화된 방식으로 접근할 수 있습니다. 행마다 Python 함수를 적용하는 대신 df['date'].dt.year라고 작성하면 Pandas가 한 번의 빠른 연산으로 모든 행의 연도를 계산합니다. 같은 접근자는 서로 다른 속성을 제공하는 timedelta64 열에도 사용할 수 있습니다.

import pandas as pd

df = pd.DataFrame({
    'event_date': pd.date_range('2024-01-01', periods=8, freq='D'),
    'revenue': [200, 350, 280, 310, 420, 380, 190, 260]
})

# Access datetime properties with .dt
print(df['event_date'].dt.year)    # 2024 for all
print(df['event_date'].dt.month)   # 1 for all
print(df['event_date'].dt.day[:5]) # 1, 2, 3, 4, 5

날짜 구성 요소 추출하기

날짜 구성 요소에 가장 흔히 사용하는 .dt 속성은 다음과 같습니다: .dt.year, .dt.month, .dt.day, .dt.day_of_week(월요일=0부터 일요일=6), .dt.day_of_year, .dt.week 또는 .dt.isocalendar().week, .dt.quarter, .dt.days_in_month. 각각은 특성으로 직접 사용할 수 있는 정수 Series를 반환합니다.

df['year']        = df['event_date'].dt.year
df['month']       = df['event_date'].dt.month
df['day']         = df['event_date'].dt.day
df['day_of_week'] = df['event_date'].dt.day_of_week  # 0=Mon
df['quarter']     = df['event_date'].dt.quarter
df['day_of_year'] = df['event_date'].dt.day_of_year

print(df[['event_date', 'year', 'month', 'day',
           'day_of_week', 'quarter']].head())

시간 구성 요소 추출하기

날짜뿐 아니라 시간 정보도 포함하는 datetime 열에는 .dt.hour, .dt.minute, .dt.second, .dt.microsecond를 사용합니다. 이는 일중 분석, 사용자 행동 모델링(아침과 저녁의 패턴 비교), 시간대가 목표 변수에 영향을 미치는 모든 시스템에서 매우 중요합니다.

df_ts = pd.DataFrame({
    'timestamp': pd.date_range('2024-01-01', periods=6, freq='4h'),
    'logins': [50, 200, 320, 280, 180, 90]
})

df_ts['hour']   = df_ts['timestamp'].dt.hour
df_ts['minute'] = df_ts['timestamp'].dt.minute
df_ts['date']   = df_ts['timestamp'].dt.date    # Python date object
df_ts['time']   = df_ts['timestamp'].dt.time    # Python time object
print(df_ts[['timestamp', 'hour', 'date']].head())

요일 이름과 월 이름

사람이 읽을 수 있는 레이블이 필요하다면 .dt.day_name()과 .dt.month_name()을 사용해 'Monday', 'January'와 같은 문자열 이름을 가져옵니다. 이는 보고서에 표시하거나 요일 및 월의 영향을 나타내는 범주형 특성을 만들 때 유용합니다. locale을 전달하면 다른 언어로 된 이름도 가져올 수 있습니다.

df['day_name']   = df['event_date'].dt.day_name()
df['month_name'] = df['event_date'].dt.month_name()

print(df[['event_date', 'day_name', 'month_name']].head(5))
# event_date day_name month_name
# 2024-01-01   Monday    January
# 2024-01-02  Tuesday    January
# 2024-01-03  Wednesday  January

주말 플래그와 영업일 플래그

날짜가 주말에 해당하는지를 나타내는 불리언 플래그는 매우 흔히 사용하는 특성입니다. day_of_week >= 5는 토요일(5)과 일요일(6)에 True를 반환합니다. 더 정교한 영업일 달력 특성이 필요하다면 numpy.busdaycalendar로 공휴일을 처리할 수 있지만, 대부분의 경우 간단한 평일/주말 구분만으로도 영향의 대부분을 포착할 수 있습니다.

df['is_weekend'] = df['event_date'].dt.day_of_week >= 5
df['is_weekday'] = ~df['is_weekend']

# Compare weekend vs weekday revenue
print(df.groupby('is_weekend')['revenue'].mean().round(1))
# is_weekend
# False    308.3  <- weekday average
# True     285.0  <- weekend average

기간 시작 및 종료 플래그

.dt 접근자는 날짜가 특정 기간의 시작인지 끝인지 식별하는 불리언 속성도 제공합니다: .dt.is_month_start, .dt.is_month_end, .dt.is_quarter_start, .dt.is_quarter_end, .dt.is_year_start, .dt.is_year_end. 이는 보고 기간, 청구 주기, 계절적 경계 효과를 파악하는 데 유용합니다.

dates_series = pd.Series(
    pd.date_range('2024-01-28', periods=10, freq='D')
)

print(dates_series[dates_series.dt.is_month_start].values)
# ['2024-02-01']

print(dates_series[dates_series.dt.is_month_end].values)
# ['2024-01-31']

시간 특성의 순환형 인코딩

월과 시간은 순환형입니다. 12월(12)은 1월(1)에 가깝고, 23:00은 00:00에 가깝습니다. 이를 선형 정수(1~12 또는 0~23)로 처리하면 대부분의 모델을 오도하게 됩니다. 순환형 특성은 사인과 코사인 변환을 사용해 인코딩합니다: sin(2π × value / max_value) 및 cos(2π × value / max_value). 이렇게 하면 원형 구조가 두 개의 숫자형 열에 반영되어 모델이 올바르게 사용할 수 있습니다.

import numpy as np

# Cyclical encoding for month (1-12)
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)

# Cyclical encoding for day of week (0-6)
df['dow_sin'] = np.sin(2 * np.pi * df['day_of_week'] / 7)
df['dow_cos'] = np.cos(2 * np.pi * df['day_of_week'] / 7)

print(df[['month', 'month_sin', 'month_cos']].head().round(3))

Timedelta 산술 연산

두 datetime 열을 빼면 timedelta64 Series가 생성됩니다. timedelta Series의 .dt 접근자는 .dt.days, .dt.seconds, .dt.total_seconds()를 제공합니다. 이를 통해 사건의 지속 시간, 마지막 구매 후 경과 시간, 일 단위 나이를 계산할 수 있으며, 모두 추가 분석에 사용할 수 있는 숫자형 열로 만들 수 있습니다.

df_orders = pd.DataFrame({
    'order_date':    pd.to_datetime(['2024-01-01', '2024-02-10', '2024-03-05']),
    'delivery_date': pd.to_datetime(['2024-01-04', '2024-02-13', '2024-03-12'])
})

# Compute delivery time in days
df_orders['delivery_days'] = (
    df_orders['delivery_date'] - df_orders['order_date']
).dt.days
print(df_orders)

인덱스의 .dt 속성 사용하기

datetime이 열이 아니라 DataFrame의 인덱스(DatetimeIndex)인 경우에는 .dt 없이 인덱스에서 동일한 속성에 직접 접근합니다: df.index.year, df.index.month, df.index.day_of_week 등입니다. 다음과 같이 이를 새 열에 직접 추가할 수도 있습니다: df['month'] = df.index.month.

df_indexed = df.set_index('event_date')

# Access components directly on the DatetimeIndex
print(df_indexed.index.month[:3])  # [1, 1, 1]
print(df_indexed.index.day_of_week[:3])  # [0, 1, 2]

# Add as new columns
df_indexed['month']   = df_indexed.index.month
df_indexed['weekday'] = df_indexed.index.day_of_week
print(df_indexed.head())

전체 시간 특성 공학 처리 절차

다음은 datetime 열이 있는 DataFrame을 받아 가장 유용한 시간 특성을 추가한 결과를 반환하는 완전한 시간 특성 공학 함수입니다. 이 방식은 시간 정보가 기록된 사건 데이터를 다루는 모든 머신러닝 또는 분석 처리 절차의 시작 부분에 바로 적용할 수 있습니다.

def add_temporal_features(df, date_col):
    dt = df[date_col].dt
    df['year']       = dt.year
    df['month']      = dt.month
    df['day']        = dt.day
    df['day_of_week'] = dt.day_of_week
    df['quarter']    = dt.quarter
    df['is_weekend'] = dt.day_of_week >= 5
    df['month_sin']  = (2 * 3.14159 * dt.month / 12).__round__(4)
    df['month_cos']  = (2 * 3.14159 * dt.month / 12).__round__(4)
    return df

result = add_temporal_features(df.copy(), 'event_date')
print(result.columns.tolist())

빠른 확인

datetime 열에서 시간 특성을 추출하는 방법에 대한 이해도를 확인해 보세요.

수업 요약

이 수업에서는 다음을 배웠습니다. .dt 접근자를 사용하면 모든 datetime 속성에 벡터화된 방식으로 접근할 수 있습니다. 자주 추출하는 특성에는 연도, 월, 일, day_of_week, 시간, 분기가 있습니다. 사인/코사인을 사용하는 순환형 인코딩은 시간과 월의 원형 특성을 처리합니다. 또한 timedelta 산술 연산을 사용하면 기간을 일 또는 초 단위로 계산할 수 있습니다. 다음으로는 고품질 차트를 만들기 위한 Matplotlib의 Figure 및 Axes 구조를 살펴봅니다.

자주 묻는 질문

“시간 특성 추출하기” 강의는 무료인가요?

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

“시간 특성 추출하기”에서 뭘 배우나요?

.dt 접근자를 사용해 날짜시간 열에서 연도, 월, 일, 요일, 시간을 추출하여 특성을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 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. DatetimeIndex와 기간 범위
  2. 시계열 리샘플링
  3. 시프트와 지연 특성
  4. 시간 특성 추출하기
← Pandas & NumPy Academy(으)로 돌아가기