본문 바로가기

Pandas

Pandas에서 시간, 날짜 다루기 - to_datetime만 잘 다루면 끝!

반응형

Pandas를 하다 보면 언젠가 고민하게 되는 날짜와 시간 다루기에 대해 알아보겠습니다.  

Pandas에서는 일자시간타입(datatime64)데이터를 이용하여 여러 데이터를 다룰 수 있는데요.

 

to_datatime 함수만 잘 다루면 사실 끝날 수 있습니다.  간단한 예제를 보시려면 이곳을 확인하세요.

실습을 위해 아래와 같은 기본 데이타는 아래와 같습니다.

 

import pandas as pd

df = pd.DataFrame({'Birth':['2019-01-01 09:10:00', '2019-01-08 09:20:30']})
print(df.info())

아래와 같이 같이 object형으로 구성이 되어 있습니다.

RangeIndex: 2 entries, 0 to 1
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Birth   2 non-null      object
dtypes: object(1)
memory usage: 144.0+ bytes

 

이것을 to_datetime으로 변환해 보겠습니다.

df['Birth'] = pd.to_datetime(df['Birth'], format='%Y-%m-%d %H:%M:%S', errors='raise')
print(df.info())

데이타 형태가 datetime64 형으로 변환이 됩니다. 이제 이를 이용해 여러 변환을 할 수 있습니다.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   Birth   2 non-null      datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 144.0 bytes

 

to_datetime의 format의 대표적인 유형은 아래와 같습니다. 사실 아래만 알아도 대부분 응용이 가능합니다. to_datetime의 Return은 Series형태가 되므로 pandas.series를 확인하면 됩니다.

Y: Year, ex) 2019, 2020
%m: Month as a zero-padded, ex) 01~12
%d: Day of the month as a zero-padded ex) 01~31
%H: Hour (24-hour clock) as a zero-padded ex) 01~23
%M: Minute as a zero-padded ex) 00~59
%S: Second as a zero-padded ex) 00~59
ex) 2019-09-01 19:30:00 =(Directivs)=> %Y-%m-%d %H:%M:%S

 

그 외에도 매우 여러 가지 dt. 함수들이 있습니다.  잘 사용하면 프로그램을 대폭 감소시킬 수 있으니 참고 바랍니다.

print('YYYY-MM-DD 형태: \n', df['Birth'].dt.date)
print('YYYY 형태: \n', df['Birth'].dt.year)
print('MM 형태: \n', df['Birth'].dt.month)
print('월(문자) 형태: \n', df['Birth'].dt.month_name())

print('일 형태: \n', df['Birth'].dt.day)
print('HH:MM:SS 형태: \n', df['Birth'].dt.time)
print('Hour 형태: \n', df['Birth'].dt.hour)
print('Minute 형태: \n', df['Birth'].dt.minute)
print('Second 형태: \n', df['Birth'].dt.second)

print('달의 마지막 날 여부 \n'df['Birth'].dt.is_month_end)
print('요일이름 형태: \n', df['Birth'].dt.day_name())
반응형