날짜 및 시간 데이터타입이란?
날짜 또는 시간 또는 날짜와 시간을 표시하는 데이터타입을 의미한다. 날짜의 경우 1년은 12개월로, 1달은 각 월에 해당하는 일수를 고려하여 값이 변해야하며 시간의 경우 1시간은 60분, 1분은 60초 등 60진법을 준수하여야 한다. 따라서 이러한 데이터를 다룰 때는 datetime 데이터타입으로 변환을 한 후 처리한다.
세부 데이터타입으로는 연-월-일을 의미하는 date 타입, 연-월-일 시:분:초 등으로 구성된 datetime 타입, 기준시각(1970-01-01 00:00:00) 이후 흘러간 초(seconds)로 구성된 timestamp 타입이 있다. 종류가 SQL의 데이터타입과 유사하므로 자세한 내용은 아래 글을 참고하면 된다.
[SQL] 날짜 및 시간 데이터
날짜 및 시간을 다루는 메소드는 크게 datetime 라이브러리 및 pandas 라이브러리에서 제공하고 있다. datetime 라이브러리는 기본에 충실하다는 장점이 있으며, pandas 라이브러리는 사용이 편하다는 장점이 있다.
datetime 라이브러리: 주로 date/datetime/timedelta 클래스를 사용한다.
사용 구문: 라이브러리-클래스-메소드
import datetime # datetime 라이브러리를 불러온다. datetime.[클래스].[메소드] # 아래 클래스와 메소드를 조합하여 이용한다.
date 클래스: 날짜에 대한 클래스이다.
클래스 속성으로 year, month, day를 받는다.
year/month/day/today/weekday/strftime 등의 속성 및 메소드를 제공한다.
사용 예시
datetime.date(2024, 7, 19).year → 2024
datetime 클래스: 날짜 및 시간에 대한 클래스이다.
클래스 속성으로 year, month, day, hour, minute, second, microsecond, tzinfo를 받는다. (굵은 속성은 필수값)
date 클래스의 메소드 외에도 hour/minues/second등의 속성 및 메소드를 제공한다.
사용 예시
datetime.datetime(2024, 7, 19, 17, 45, 30).minute → 45
timedelta 클래스: 날짜나 시간의 차이에 대한 클래스이다. 날짜 연산 시 사용되는 매우 중요한 클래스이다.
클래스 속성으로 days, seconds, microseconds를 받으며, 두 date(time) 클래스 객체를 뺄 경우 자동으로 설정되기도 한다.
사용 예시
dt1 = datetime.datetime(2024, 7, 19, 17, 45, 30) dt2 = datetime.datetime(2024, 7, 29, 17, 45, 30) dt2 - dt1 → datetime.timedelta(days=10) dt3 = dt2 + datetime.timedelta(days = 20) dt3 → datetime.datetime(2024, 8, 18, 17, 45, 30)
Pandas 라이브러리: to_datetime, date_range 함수 외에 shift, resample 등의 메소드를 제공하며, dt접근자로 datetime의 속성 및 메소드를 이용할 수도 있다.
to_datetime 함수: 문자형식의 날짜/시간 표기를 datetime 타입으로 자동 변환해주는 매우 편리한 함수이다. 연/월/일/시/분/초의 표기가 구분되어 있으면 자동 포맷팅을 적용하며, 그렇지 않은 경우 수동 포맷팅도 가능하다.
사용 예시
pd.to_datetime('2024-07-19') → Timestamp('2024-07-20 00:00:00') pd.to_datetime('2024년 7월 20일', format = '%Y년 %m월 %d일') → Timestamp('2024-07-20 00:00:00')
date_range 함수: 설정한 범위 내에서 동일한 간격으로 datetimeIndex를 자동으로 생성해주는 함수이다. 별도의 datetime 데이터가 없어 이를 생성해야 할 때 유용하게 사용한다.
사용 예시
pd.date_range('2024-07-19', '2024-08-19', freq = '3d') → DatetimeIndex(['2024-07-19', '2024-07-22', '2024-07-25' , '2024-07-28','2024-07-31', '2024-08-03', '2024-08-06', '2024-08-09' , '2024-08-12', '2024-08-15', '2024-08-18'], dtype='datetime64[ns]', freq='3D') pd.date_range('2024-07-19', periods=20, freq = '3d') → DatetimeIndex(['2024-07-19', '2024-07-22', '2024-07-25', '2024-07-28' ,'2024-07-31', '2024-08-03', '2024-08-06', '2024-08-09','2024-08-12' , '2024-08-15', '2024-08-18', '2024-08-21','2024-08-24', '2024-08-27' , '2024-08-30', '2024-09-02','2024-09-05', '2024-09-08', '2024-09-11' , '2024-09-14'], dtype='datetime64[ns]', freq='3D')
resample 메소드: 주어진 시계열 데이터를 동일한 주기에 따라 그룹으로 묶고 그룹 내 다른 열에 대해 연산을 수행할 수 있는 메소드이다. 분기 평균, 1년 평균 등 자료 연산을 매우 손쉽게 할 수 있다. pandas의 groupby 메소드와 유사하며 변수별 범주가 아닌 시계열 범주를 활용하는 점이 다르다.
사용 예시
df_covid_2.resample('m', on = '일자').sum() # 날짜가 index가 아닌 경우 on으로 날짜변수 설정 → 각 별수의 월별 자료의 합계가 구해짐
dt 접근자: 놀랍게도, pandas에서는 dt 접근자를 이용해 데이터프레임의 각 열에 대해서 datetime 속성과 메소드를 적용할 수 있다. 이는 string 타입의 함수를 적용할 때 str 접근자를 쓴 것과 유사하다.
사용 예시
df_covid_2.date_col.dt.day_name() → date_col의 날짜정보를 통해 요일(Mon, Tue, ..., Sun)정보를 추출
위 내용을 종합해보면 데이터프레임의 형식이 아닌 데이터 가공 시에는 datetime 라이브러리를 활용해야 할 것이며, 데이터프레임 형식 데이터 가공 시에는 pandas를 이용하는 것이 편리해보인다.
다만, datetime의 timedelta 클래스를 이용한 연산은 판다스에서 별도 함수로 제공하지 않으므로 날짜 및 시간 연산이 필요한 경우 datetime 라이브러리를 불러온 후 작업이 필요하다.