pandas에서 날짜와 시간 다루기 :: 시계열 분석 - mindscale
Skip to content

pandas에서 날짜와 시간 다루기

이번 시간에는 판다스 라이브러리를 이용하여 날짜와 시간을 다루는 방법에 대해 알아보겠습니다. 판다스는 파이썬에서 표 형태의 데이터를 다룰 수 있는 편리한 기능을 제공합니다. 판다스를 사용하려면 우선 파이썬에서 import를 통해 판다스를 가져와야 합니다. 여기서 as pd는 판다스를 pd로 줄여서 부르겠다는 의미로, 이후 파이썬 코드에선 'pd'로 판다스를 참조하게 됩니다.

import pandas as pd

판다스에는 to_datetime이라는 함수가 있습니다. 이 함수의 이름에서 볼 수 있듯이, 'to'는 변환을 의미하고 'datetime'은 날짜와 시간을 의미합니다. 따라서 to_datetime 함수는 입력값을 날짜와 시간 정보를 담은 객체로 변환하는 역할을 합니다.

예를 들어 '2022년 8월 29일'과 같이 문자열로 표현된 날짜를 컴퓨터가 날짜 정보로 인식하도록 바꿀 수 있습니다. 단순히 문자열로 취급되는 경우엔 이 데이터가 연도인지, 날짜인지 명확히 알 수 없지만, to_datetime 함수를 이용하여 날짜 형식으로 변환하면 컴퓨터가 올바르게 인식하게 됩니다.

이렇게 변환된 날짜는 date 변수에 저장이 되고, 이 date 변수는 이후 날짜와 시간 정보를 담고 있게 됩니다.

date = pd.to_datetime('2022-08-29')
date
Timestamp('2022-08-29 00:00:00')

판다스에서는 'date' 변수에 저장된 날짜 정보를 다양한 형태로 변환할 수 있습니다. 이 중 한 방법은 'timestamp'라는 함수를 사용하는 것입니다. 'timestamp' 함수는 날짜 정보를 유닉스 시간으로 변환하여 보여줍니다.

유닉스 시간은 1970년 1월 1일을 기점으로 흐른 시간을 초 단위로 나타낸 것입니다. 예를 들어 1970년 1월 1일부터 2022년 8월 29일까지의 시간을 초로 변환하면 이렇게 큰 수가 나옵니다.

date.timestamp()
1661731200.0

이 수치가 맞는지 대략적인 확인을 위해 1970년부터 2022년까지는 52년, 그리고 추가로 8개월이 지나간 것을 감안하면, 대략적으로 유닉스 시간과 비슷한 값을 얻을 수 있습니다. 여기에 1년은 365일, 1일은 24시간, 1시간은 60분, 1분은 60초라는 사실을 곱해보면 두 수치가 비슷함을 알 수 있습니다. 물론 이에는 윤년이 있어서 정확히 일치하지는 않지만 대략적으로 확인할 수 있습니다.

(52 + 8 / 12) * 365 * 24 * 60 * 60
1660896000.0

문자열로 표현된 날짜를 DateTime 형식으로 변환해두면 날짜와 시간 관련된 다양한 계산을 할 수 있습니다. 이 중 하나는 시간 간격을 추가하거나 빼는 것입니다.

판다스에서는 pd.to_timedelta라는 특별한 함수를 이용하여 시간의 차이를 계산할 수 있습니다. time delta는 '시간의 차이'를 의미하는데, 이는 그리스 문자인 델타에서 유래된 것으로, 델타는 보통 차이나 차별을 나타냅니다. 따라서 pd.to_timedelta는 시간의 차이를 나타내는 데이터 형식을 생성하는 것입니다.

예를 들어, 숫자 1, 2, 3을 각각 시간의 차이로 바꾸는 작업을 수행합니다. 이후 이 데이터를 이용하여 시간 간격을 계산할 수 있습니다.

'D'는 일(day)을 나타냅니다. 이외에도 다양한 단위를 사용해서 시간의 차이를 계산할 수 있습니다. 대문자 'Y'는 'Year'를, 대문자 'M'은 'Month'를, 대문자 'W'는 'Week'를 나타냅니다. 그리고 이후 표현에서는 소문자를 사용하며, 'h'는 'hour', 'm'는 'minute', 's'는 'second'를 나타냅니다. 따라서 이 방식으로 시간의 차이를 다양한 단위로 표현할 수 있습니다.

Timedelta 값인 'delta'는 시간 차이를 나타내므로, 특정 날짜나 시간에 'delta'를 더하거나 빼면 그만큼의 시간을 옮긴 새로운 시간 값을 얻을 수 있습니다.

delta = pd.to_timedelta([1, 2, 3], 'D')
date + delta
DatetimeIndex(['2022-08-30', '2022-08-31', '2022-09-01'], dtype='datetime64[ns]', freq=None)

이제 날짜를 이용한 인덱싱에 대해 알아보겠습니다.

인덱싱이란 데이터 표에서 각 행에 고유번호를 부여하는 것을 말합니다. 예를 들어, 표에 1번, 2번, 3번, 4번, 5번 등의 고유번호를 부여하면, 특정 행을 쉽게 참조할 수 있습니다. 즉, '3번 행'이나 '5번 행'을 통해 각 행을 가리킬 수 있습니다.

행의 고유번호, 즉 인덱스는 다양한 형태가 될 수 있는데, 이 중 하나가 날짜입니다. 날짜로 인덱스를 생성할 때는 'DatetimeIndex'라는 형태를 사용합니다.

예를 들어, '2014년 7월 4일', '2014년 8월 4일', '2015년 7월 4일', '2015년 8월 4일' 등의 날짜를 인덱스로 사용하려면 해당 날짜들을 'DatetimeIndex'로 변환하여 인덱스로 사용하면 됩니다.

index = pd.DatetimeIndex([
    '2014-07-04', '2014-08-04', '2015-07-04', '2015-08-04'])

다음으로, 판다스의 'Series'라는 데이터 구조에 대해 알아보겠습니다.

'Series'는 순서대로 배열된 데이터를 뜻하며, 일련의 영화나 전시와 같이 연속적인 내용을 뉴온게 '시리즈'라고 하곤 합니다. 같은 방식으로, 순서대로 정렬된 데이터를 'Series'라고 부릅니다.

예를 들어, 데이터가 100, 200, 300, 400이고 이에 대응하는 인덱스가 '2014년 7월 4일', '2014년 8월 4일', '2015년 7월 4일', '2015년 8월 4일'이라고 할 때, 각 데이터에 대응하는 인덱스를 부여하면 아래와 같습니다.

data = pd.Series([100, 200, 300, 400], index=index)
data
2014-07-04    100
2014-08-04    200
2015-07-04    300
2015-08-04    400
dtype: int64

인덱스를 부여한 후에는 인덱스를 이용해 특정 데이터를 가리키거나 추출할 수 있습니다.

예를 들어 '2014년 7월 4일':'2015년 7월 4일'이라고 범위를 지정하면, 해당 범위에 속하는 데이터를 선택할 수 있습니다. 또한, 특정 날짜를 지정하면 그 시점의 데이터를 직접 얻을 수 있습니다. '2015'와 같이 연도만 입력하면, 해당 연도에 해당하는 모든 데이터를 출력하게 됩니다.

따라서 원래의 데이터 시리즈는 왼쪽에 인덱스가, 오른쪽에 데이터 값이 있습니다. '2014년 7월 4일'부터 '2015년 7월 4일'까지의 범위를 지정하면, 대응하는 값인 100, 200, 300이 출력됩니다.

data['2014-07-04':'2015-07-04']
2014-07-04    100
2014-08-04    200
2015-07-04    300
dtype: int64

'2015'라고 입력하면, 2015년에 해당하는 값인 300, 400의 두 개 값만 출력됩니다.

data['2015']
2015-07-04    300
2015-08-04    400
dtype: int64