Python/데이터 분석

[python] datetime 활용 날짜별(년, 월, 일, 요일) 인덱싱 방법

비전공생's 2022. 5. 3. 09:37

 

데이터를 분석하다 보면 자주 사용하게 되는 것 중 하나가 날짜가 아닐까 싶다.

원본 데이터의 날짜 컬럼을 사용할 수도 있지만, 만약 특정 년, 월, 일, 요일 등을 따로 뽑아내어 분석하고 싶다면 어떻게 해야할까?

 

날짜 데이터를 활용할 때 사용하는 모듈인 datetime에 대하여 정리해보자.

 

 

datetime 모듈의 자료형

자료형 date: 그레고리안 달력을 사용해서 날짜(연, 월, 일)를 저장

자료형 time: 하루의 시간을 시, 분, 초, 마이크로초 단위로 저장

자료형 datetime: 날짜와 시간을 저장

자료형 timedelta: 두 datetime 값 간의 차이(일, 초, 마이크로초)를 표현

자료형 tzinfo: 지역시간대를 저장하기 위한 기본 자료형

data_range: 날짜 범위 생성

pandas.data_range를 사용하면 특정 빈도에 따라 지정한 길이만큼 DatetimeIndex를 생성

 

pd.date_range(start = '날짜 범위 시작' end = 날짜 범위 끝 periods = 생성할 Timestamp 개수 freq = 시간 간격 tz = 시간대(timezone)
 

 

빈도와 날짜 오프셋(Frequencies and Date Offsets)

- pandas에서 빈도는 기본 빈도(basic frequency) 와 배수의 조합으로 이루어짐

- freq 인수로 특정한 날짜만 생성되도록 할 수 있음

 

많이 사용하는 freq 인수값

s: 초

T: 분

H: 시간

D: 일(day)

B: 주말이 아닌 평일

W: 주(일요일)

W-MON: 주(월요일)

M: 각 달(month)의 마지막 날

MS: 각 달의 첫날

BM: 주말이 아닌 평일 중에서 각 달의 마지막 날

BMS: 주말이 아닌 평일 중에서 각 달의 첫날

WOM-2THU: 각 달의 두번째 목요일

Q-JAN: 각 분기의 첫달의 마지막 날

Q-DEC: 각 분기의 마지막 달의 마지막 날

 

 

# 예시1) 주말이 아닌 평일
pd.date_range("2022-4-1", "2022-4-30", freq="B")

# 예시2) 주(일요일)만 출력
pd.date_range("2022-1-1", "2022-12-31", freq="W")
 

 

dtype부터 datetime으로 바꾸기

 

# reserve_datetime(본인이 불러온 데이터 중 날짜가 있는 컬럼) -> datetime로 변환

df['reserve_datetime'] = pd.to_datetime(df['reserve_datetime'])
df.dtypes
 

 

연도별/월별 컬럼 추가하기

 

# 월별 매출 (df_by_ym)
# reserve_datetime 컬럼을 인덱스로 설정
# df 에 insert 이용하여 연, 월 컬럼 생성 -> 연, 월 컬럼으로 groupby 사용

df.insert(4, 'Year', df.reserve_datetime.dt.year)
df.insert(5, 'Month', df.reserve_datetime.dt.month)

df.head()
 

 

요일별 컬럼도 추가해보기

 

# 요일별 매출 (df_by_d_of_w)
# 요일 컬럼을 만들어서 groupby

df.insert(6, 'DayofWeek', df.reserve_datetime.dt.dayofweek)
df.head()
 

 

이렇게 컬럼을 추가해보았다면,

원하는대로 월별 매출, 요일별 매출 등 원하는 분석을 할때에 유용하게 사용할 수 있다.