데이터 분석

데이터 분석을 통한 세상 엿보기

시계열

시계열time series (1)

nova-unum 2022. 7. 28. 13:40

시계열time series (1)

시계열 데이터는 금융, 경제, 생태학, 신경과학, 물리학 등 여러 다양한 분야에서 사용되는 매우 중요한 구조화된 데이터다. 시간상의 여러 지점을 관측하거나 측정할 수 있는 모든 것이 시계열이다. 

대부분의 시계열은 고정 빈도 fixed frequency로 표현되는데 데이터가 존재하는 지점이 15초마다, 5분마다, 한 달에 한 번 같은 특정 규칙에 따라 고정 간격을 가지게 된다. 

시계열은 또한 고정된 단위나 시간 혹은 단위들 간의 간격으로 존재하지 않고 불규칙적인 모습으로 표현될 수도 있다. 

어떻게 시계열 데이터를 표시하고 참조할지는 애플리케에 의존적이며 다음중 한 유형일 수 있다.

● 시간 내에서 특정 순간의 타임스탬프

● 2007년 1월이나 2010년 전체 같은 고정된 기간

● 시작과 끝 타임스탬프로 표시되는 시간 간격. 기간은 시간 간격의 특수한 경우로 생각할 수 있다.

● 실험 혹은 경과 시간. 각 타임스탬프는 특정 시작 시간에 상대적인 시간의 측정값이다. (예 : 쿠키를 오븐에 넣은 시점부터 매 초가 지날 때마다 쿠키 반죽의 지름)

실험의 시작 시점부터의 경과 시간이 정수나 부동소수점으로 표현되는 경우 실험 시계열에도 해당 기술들을 적용할 수 있지만 위에서 소개한 시계열 데이터의 처음 3가지 종류에 대해 주로 알아볼 것이다. 가장 단순하고 널리 사용되는 시계열의 종류는 타임스탬프로 색인된 데이터다. 

pandas는 시간차에 기반한 색인을 지원하며, 이는 경과 시간을 나타날 때 유용하다. pandas는 표준 시계열 도구와 데이터 알고리즘을 제공한다. 이를 통해 대량의 시계열 데이터를 효과적으로 다룰 수 있으며 쉽게 나누고, 집계하고, 불규칙이며 고정된 빈도를 갖는 시계열을 리샘플링 할 수 있다. 대부분의 도구는 금융이나 경제 관련 애플리케이션에서 특히 유용하다. 하지만 서버 로그 데이터를 분석하는 데도 사용할 수 있다.

날짜, 시간 자료형, 도구

파이썬 표준 라이브러리는 날짜와 시간을 위한 자료형과 달력 관련 기능을 제공하는 자료형이 존재한다. datetime, time 그리고 calendar 모듈등이 있다. datetime.datetime형이나 단순한 datetime이 널리 사용되고 있다.

from datetime import datetime

now = datetime.now()
now
datetime.datetime(2022, 7, 27, 14, 17, 51, 189618)
now.year, now.month, now.day
(2022, 7, 27)

파이썬 표준 라이브러리는 날짜와 시간을 위한 자료형과 달력 관련 기능을 제공하는 자료형이 존재한다. datetime, timedelta는 두 datetime 객체 간의 시간적인 차이를 표현할 수 있다.

delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)
delta
datetime.timedelta(days=926, seconds=56700)

delta.days
926

delta.seconds
56700

timedelta를 더하거나 빼면 그만큼의 시간이 datetime 객체에 적용되어 새로운 객체를 만들 수 있다.

from datetime import timedelta

start = datetime(2011, 1, 7)

start + timedelta(12)
datetime.datetime(2011, 1, 19, 0, 0)
start - 2 * timedelta(12)
datetime.datetime(2010, 12, 14, 0, 0)

 

datetime 모듈의 자료형

자료형 설명
date 그레고리안 달력을 사용해서 날짜(연, 월, 일)를 저장한다.
time 하루의 시간을 시, 분, 초, 마이크로초 단위로 저장한다.
datetime 날짜와 시간을 저장한다.
timedelta 두 datetime 값 간의 차이(일, 초, 마이크로초)를 표현한다.
tzinfo 지역시간대를 저장하기 위한 기본 자료형

 

문자열을 datetime으로 변환하기

datetime 객체와 나중에 소개할 pandas의 Timestamp 객체는 str 메서드나 strftime 메서드에 포맷 규칙을 넘겨서 문자열로 나타낼 수 있다. 

stamp = datetime(2011, 1,3)
str(stamp)
'2011-01-03 00:00:00'

stamp.strftime('%Y-%m-%d')
'2011-01-03'

Datetime  포맷 규칙(ISO C89 호환)

포맷 설명 포맷 설명
%Y 4자리 연도 %y 2자리 연도
%m 2자리 월[01, 12] %d 2자리 일[01, 31]
%H 시간(24시간 형식)[00,23] %I 시간(12시간 형식)[01, 12]
%M 2자리 분[00,59] %S 초[00,61](60, 61은 윤초)
%w 정수로 나타낸 요일[0(일요일), 6]
%U 연중 주차[00,53]. 일욜일을 그 주의 첫 번째 날로 간주하며, 그 해에서 첫 번째 일요일 앞에 있는 날은 0주차가 된다.
%W 연중 주차[00,53]. 월욜일을 그 주의 첫 번째 날로 간주하며, 그 해에서 첫 번째 월요일 앞에 있는 날은 0주차가 된다.
%z UTC 시간대 오프셋을 +HHMM 또는 -HHMM으로 표현한다. 만약 시간대를 신경쓰지 않느다면 비워둔다.
%F %Y-%m-%d 형식에 대한 축약(예:2012-4-18)
%D %m/%d/%y 형식에 대한 축약(예:04/18/12)

이 포맷 코드는 datetime.strptime을 사용해서 문자열을 날짜로 변환할 때 사용할 수 있다.

value = '2011-01-03'
datetime.strptime(value, '%Y-%m-%d')

datetime.datetime(2011, 1, 3, 0, 0)

datestrs =['7/6/2011','8/6/2011']
[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]

[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]

datetime.strptime은 알려진 형식의 날짜를 파싱하는 최적의 방법이다. 하지만 매번 포맷 규칙을 써야 하는 건 귀찮은 일이다. 특히 흔시 쓰는 날짜 형식에 대해서는 더 그렇다. 이 경우에는 서드파티 패키지인 dateutil에 포함된 parser.parse 메서드를 사용하면 된다.(pandas를 설치할 때 자동으로 함께 설치된다.)

from dateutil.parser import parse

parse('2011-01-03')

datetime.datetime(2011, 1, 3, 0, 0)

dateutil은 거의 대부분의 사람이 인지하는 날짜 표현 방식을 파싱할 수 있다.

parse('Jan 31, 1997 10:45 PM')

datetime.datetime(1997, 1, 31, 22, 45)

국제 로케일의 경우 날짜가 월 앞에 오는 경우가 매우 흔하다. 이런 경우에는 dayfirst=True를  넘겨주면 된다.

parse('6/12/2011', dayfirst=True)
datetime.datetime(2011, 12, 6, 0, 0)

pandas는 일반적으로 DataFrame의 컬럼이나 축 색인으로 날짜가 담긴 배열을 사용한다. to_datetime 메서드는 많은 종류의 날짜 표현을 처리한다. ISO 8601 같은 표준 날짜 형식은 매우 빠르게 처리할 수 있다.

datestrs =['2011-07-06 12:00:00', '2011-08-06 00:00:00']
pd.to_datetime(datestrs)

DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)

또한 누락된 값(None, 빈 문자열 등)으로 간주되어야 할 값도 처리해준다

idx = pd.to_datetime(datestrs + [None])
idx
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)

idx[2]

NaT

pd.isnull(idx)
array([False, False,  True])

NaT Not a Time는 pandas에서 누락된 타임스탬프 데이터를 나타낸다.

datetime 객체는 여러 나라 혹은 언어에서 사용하는 로케일에 맞는 다양한 포맷 옵션을 제공한다. 예를 들어 독일과 프랑스에서는 각 월의 단축명이 영문 시스템과 다르다.

로케일별 날짜 포맷

포맷 설명
%a 축약된 요일 이름
%A 요일 이름
%b 축약된 월 이름
%B 월 이름
%c 전체 날짜와 시간(예:'The 01 May 2012 04:20:57 PM')
%p 해당 로케일에서 AM, PM에 대응되는 이름(AM은 오전, PM은 오후)
%x 로케일에 맞는 날짜 형식(예: 미국이라면 2012년 5월1일은 '05/01/2012')
%X 로케일에 맞는 시간 형식(예:'04:24:12 PM')

'시계열' 카테고리의 다른 글

횡단면, 종단면, 시계열자료  (0) 2022.12.10
시계열time series (4)  (0) 2022.08.05
시계열time series (3)  (0) 2022.08.04
시계열time series (2)  (0) 2022.07.29