[Pandas] .dt accessor
Pandas dt, Pandas .dt, Pandas dt accessor, datetime accessor
정의
Series.dt 는 datetime Series 의 각 구성요소 (년/월/일/시/분/요일 등) 에 벡터로 접근하는 accessor. str 의 datetime 버전.
s.dt.year
s.dt.month
s.dt.day
s.dt.hour
s.dt.weekday
기본 컴포넌트
| 속성 | 의미 |
|---|---|
dt.year, dt.month, dt.day | 년/월/일 |
dt.hour, dt.minute, dt.second | 시/분/초 |
dt.dayofweek / dt.weekday | 요일 (0=월) |
dt.day_name() | 요일 이름 (‘Monday’) |
dt.month_name() | 월 이름 (‘January’) |
dt.quarter | 분기 (1-4) |
dt.dayofyear | 그 해의 몇일째 |
dt.week, dt.isocalendar() | 주차 |
dt.is_month_end, dt.is_month_start | 월말/월초 boolean |
dt.days_in_month | 그 달의 일 수 |
사용
python
import pandas as pd
s = pd.to_datetime(['2024-01-15', '2024-03-30', '2024-12-25'])
s = pd.Series(s)
print('year :', s.dt.year.tolist())
print('month:', s.dt.month.tolist())
print('day :', s.dt.day.tolist())
print('weekday:', s.dt.day_name().tolist())
print('quarter:', s.dt.quarter.tolist()) 결과
year : [2024, 2024, 2024]
month: [1, 3, 12]
day : [15, 30, 25]
weekday: ['Monday', 'Saturday', 'Wednesday']
quarter: [1, 1, 4]포맷 변환
s.dt.strftime('%Y-%m-%d') # 문자열로
s.dt.strftime('%Y년 %m월 %d일 (%A)')
s.dt.normalize() # 시간 0으로 (날짜만)
s.dt.floor('h') # 시간 단위 내림
s.dt.ceil('h') # 올림
s.dt.round('15min') # 반올림
timezone
s.dt.tz # 현재 timezone
s.dt.tz_localize('Asia/Seoul') # naive → aware
s.dt.tz_convert('UTC') # 다른 timezone 으로
Timedelta 의 dt
td = pd.to_timedelta(['1 days 02:30:00', '2 days 05:00:00'])
td = pd.Series(td)
td.dt.days # [1, 2]
td.dt.seconds # 9000, 18000 (하루 안의 초)
td.dt.total_seconds() # 전체 초
자주 쓰는 패턴
월별 분석
df['month'] = df['created_at'].dt.to_period('M') # PeriodIndex (2024-01, 2024-02, ...)
df.groupby('month')['amount'].sum()
요일별 트렌드
df['weekday'] = df['date'].dt.day_name()
df.groupby('weekday')['orders'].mean()
영업일 / 주말
df['is_weekend'] = df['date'].dt.dayofweek >= 5
datetime 차이
df['days_since_signup'] = (pd.Timestamp.today() - df['signup_date']).dt.days
함정
1. dt 가 안 되는 경우
s = pd.Series(['2024-01-15', '2024-02-20'])
s.dt.year # AttributeError, str 이라서
# 먼저 변환
pd.to_datetime(s).dt.year
2. tz-aware vs naive 비교
naive.tz_localize('UTC') > aware # ✓
naive > aware # TypeError 가능
3. dayofweek 의 시작 (월요일 = 0)
s.dt.dayofweek # 0=Mon ... 6=Sun
s.dt.weekday # 같음
# Python 의 datetime.weekday() 과 동일
ISO 표준 (1=Mon) 은 s.dt.isocalendar().day.
참고
이 글의 용어 (3개)
- [Pandas] date_range / Timestamppandas
- 정의 - : 정해진 시작/끝/간격으로 datetime 시퀀스 생성 - : pandas 의 단일 datetime 객체 - : 시간 차이 daterange , , , 중 3 개 만 …
- [Pandas] resamplepandas
- 정의 는 시계열 데이터를 다른 빈도 (월별, 일별, 시간별 등) 로 재샘플링하면서 집계한다. 의 시계열 버전. DatetimeIndex (또는 으로 datetime 컬럼) 이 필…
- [Pandas] to_datetimepandas
- 정의 는 문자열/숫자를 datetime 으로 변환. pandas 의 시계열 작업의 시작. 기본 <CodeWithOutput language="python" outputLangua…
💬 댓글