시계열time series (1)
시계열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') |