Pandas 타임 시리즈 (Time series)


Pandas는 frequency 변환 과정에서 리샘플링을 수행하기 위한 간단하고 강력하고 효율적인 기능을 갖고 있습니다.

이것은 금융 분야에서 매우 흔하지만 다른 분야에서도 자주 사용됩니다.




1) 기본 사용

예제1

import pandas as pd
import numpy as np

rng = pd.date_range('1/1/2012', periods=100, freq='S')

print(rng)
DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 00:00:01',
             '2012-01-01 00:00:02', '2012-01-01 00:00:03',
             '2012-01-01 00:00:04', '2012-01-01 00:00:05',
             '2012-01-01 00:00:06', '2012-01-01 00:00:07',
             '2012-01-01 00:00:08', '2012-01-01 00:00:09',
             '2012-01-01 00:00:10', '2012-01-01 00:00:11',
             '2012-01-01 00:00:12', '2012-01-01 00:00:13',
             '2012-01-01 00:00:14', '2012-01-01 00:00:15',
             '2012-01-01 00:00:16', '2012-01-01 00:00:17',
             '2012-01-01 00:00:18', '2012-01-01 00:00:19',
             '2012-01-01 00:00:20', '2012-01-01 00:00:21',
             '2012-01-01 00:00:22', '2012-01-01 00:00:23',
             '2012-01-01 00:00:24', '2012-01-01 00:00:25',
             '2012-01-01 00:00:26', '2012-01-01 00:00:27',
             '2012-01-01 00:00:28', '2012-01-01 00:00:29',
             '2012-01-01 00:00:30', '2012-01-01 00:00:31',
             '2012-01-01 00:00:32', '2012-01-01 00:00:33',
             '2012-01-01 00:00:34', '2012-01-01 00:00:35',
             '2012-01-01 00:00:36', '2012-01-01 00:00:37',
             '2012-01-01 00:00:38', '2012-01-01 00:00:39',
             '2012-01-01 00:00:40', '2012-01-01 00:00:41',
             '2012-01-01 00:00:42', '2012-01-01 00:00:43',
             '2012-01-01 00:00:44', '2012-01-01 00:00:45',
             '2012-01-01 00:00:46', '2012-01-01 00:00:47',
             '2012-01-01 00:00:48', '2012-01-01 00:00:49',
             '2012-01-01 00:00:50', '2012-01-01 00:00:51',
             '2012-01-01 00:00:52', '2012-01-01 00:00:53',
             '2012-01-01 00:00:54', '2012-01-01 00:00:55',
             '2012-01-01 00:00:56', '2012-01-01 00:00:57',
             '2012-01-01 00:00:58', '2012-01-01 00:00:59',
             '2012-01-01 00:01:00', '2012-01-01 00:01:01',
             '2012-01-01 00:01:02', '2012-01-01 00:01:03',
             '2012-01-01 00:01:04', '2012-01-01 00:01:05',
             '2012-01-01 00:01:06', '2012-01-01 00:01:07',
             '2012-01-01 00:01:08', '2012-01-01 00:01:09',
             '2012-01-01 00:01:10', '2012-01-01 00:01:11',
             '2012-01-01 00:01:12', '2012-01-01 00:01:13',
             '2012-01-01 00:01:14', '2012-01-01 00:01:15',
             '2012-01-01 00:01:16', '2012-01-01 00:01:17',
             '2012-01-01 00:01:18', '2012-01-01 00:01:19',
             '2012-01-01 00:01:20', '2012-01-01 00:01:21',
             '2012-01-01 00:01:22', '2012-01-01 00:01:23',
             '2012-01-01 00:01:24', '2012-01-01 00:01:25',
             '2012-01-01 00:01:26', '2012-01-01 00:01:27',
             '2012-01-01 00:01:28', '2012-01-01 00:01:29',
             '2012-01-01 00:01:30', '2012-01-01 00:01:31',
             '2012-01-01 00:01:32', '2012-01-01 00:01:33',
             '2012-01-01 00:01:34', '2012-01-01 00:01:35',
             '2012-01-01 00:01:36', '2012-01-01 00:01:37',
             '2012-01-01 00:01:38', '2012-01-01 00:01:39'],
            dtype='datetime64[ns]', freq='S')

date_range()함수는 주어진 간격의 DatetimeIndex를 반환합니다.

‘1/1/2012’를 시작 지점으로 해서 ‘S’ (Second) 간격을 갖는 100개의 DatetimeIndex를 만들었습니다.



예제2

ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)

print(ts)
2012-01-01 00:00:00    172
2012-01-01 00:00:01     47
2012-01-01 00:00:02    117
2012-01-01 00:00:03    192
2012-01-01 00:00:04    323
                    ...
2012-01-01 00:01:35     99
2012-01-01 00:01:36     53
2012-01-01 00:01:37    396
2012-01-01 00:01:38    121
2012-01-01 00:01:39    426
Freq: S, Length: 100, dtype: int64

위의 예제에서 만들었던 DatetimeIndex (rng)를 인덱스로 하는 Series를 만들었습니다.

NumPy random 모듈np.random.randint() 함수는 임의의 정수를 반환합니다.



예제3

print(ts.resample('5S').sum())
print(ts.resample('5Min').sum())
2012-01-01 00:00:00     851
2012-01-01 00:00:05    1025
2012-01-01 00:00:10     968
2012-01-01 00:00:15    1463
2012-01-01 00:00:20     874
2012-01-01 00:00:25     932
2012-01-01 00:00:30    1491
2012-01-01 00:00:35    1749
2012-01-01 00:00:40    1276
2012-01-01 00:00:45    1403
2012-01-01 00:00:50    1058
2012-01-01 00:00:55     791
2012-01-01 00:01:00    1330
2012-01-01 00:01:05    1118
2012-01-01 00:01:10    1378
2012-01-01 00:01:15    1008
2012-01-01 00:01:20    1866
2012-01-01 00:01:25    1092
2012-01-01 00:01:30    1385
2012-01-01 00:01:35    1095
Freq: 5S, dtype: int64
2012-01-01    24153
Freq: 5T, dtype: int64

ts.resample(‘5S’).sum()는 5초 단위로 값을 합산합니다.

ts.resample(‘5Min’).sum()는 5분 단위로 값을 합산합니다.




2) 타임존 표현하기

예제1

rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')

print(rng)
DatetimeIndex(['2012-03-06', '2012-03-07', '2012-03-08', '2012-03-09',
             '2012-03-10'],
            dtype='datetime64[ns]', freq='D')

‘3/6/2012’를 시작으로 하고 ‘D’ (Day) 간격을 갖는 다섯 개의 DatetimeIndex를 만들었습니다.



예제2

ts = pd.Series(np.random.randn(len(rng)), rng)
print(ts)

ts_utc = ts.tz_localize('UTC')
print(ts_utc)
2012-03-06    1.764052
2012-03-07    0.400157
2012-03-08    0.978738
2012-03-09    2.240893
2012-03-10    1.867558
Freq: D, dtype: float64

2012-03-06 00:00:00+00:00    1.764052
2012-03-07 00:00:00+00:00    0.400157
2012-03-08 00:00:00+00:00    0.978738
2012-03-09 00:00:00+00:00    2.240893
2012-03-10 00:00:00+00:00    1.867558
Freq: D, dtype: float64

이번에는 NumPy random 모듈np.random.randn() 함수를 사용해서 임의의 난수를 만들었습니다.

tz_localize(‘UTC’)는 입력한 타임존에 맞게 Datetime Array/Index를 지역화합니다.

Datetime Array/Index가 tz-naive에서 tz-aware 상태가 되었습니다.




3) 타임존 변환하기

예제

print(ts_utc.tz_convert('US/Eastern'))
2012-03-05 19:00:00-05:00    1.764052
2012-03-06 19:00:00-05:00    0.400157
2012-03-07 19:00:00-05:00    0.978738
2012-03-08 19:00:00-05:00    2.240893
2012-03-09 19:00:00-05:00    1.867558
Freq: D, dtype: float64

tz_convert()tz-aware Datetime Array/Index를 다른 타임존으로 변환합니다.




4) 시간 단위 표현 변환하기

예제1

rng = pd.date_range('1/1/2012', periods=5, freq='M')
ts = pd.Series(np.random.randn(len(rng)), index=rng)

print(ts)
2012-01-31    1.764052
2012-02-29    0.400157
2012-03-31    0.978738
2012-04-30    2.240893
2012-05-31    1.867558
Freq: M, dtype: float64

‘1/1/2012’를 시작으로하고 ‘M’ (Month) 간격을 갖는 다섯 개의 DatetimeIndex를 만들었습니다.

이어서 이 DatetimeIndex를 인덱스로 하고 임의의 난수를 갖는 Series를 만들었습니다.



예제2

ps = ts.to_period()
print(ps)
2012-01    1.764052
2012-02    0.400157
2012-03    0.978738
2012-04    2.240893
2012-05    1.867558
Freq: M, dtype: float64

to_period()는 Datatime Array/Index를 특정 간격을 갖는 PeriodArray/Index로 변환합니다.


예제3

print(ps.to_timestamp())
2012-01-01    1.764052
2012-02-01    0.400157
2012-03-01    0.978738
2012-04-01    2.240893
2012-05-01    1.867558
Freq: MS, dtype: float64

to_timestamp()는 DatetimeIndex를 주기의 시작점으로 변환합니다.



예제4

prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')
ts = pd.Series(np.random.randn(len(prng)), prng)

ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9

print(ts.head())
1990-03-01 09:00   -0.977278
1990-06-01 09:00    0.950088
1990-09-01 09:00   -0.151357
1990-12-01 09:00   -0.103219
1991-03-01 09:00    0.410599
Freq: H, dtype: float64

주기 (period)와 타임스탬프 (timestamp) 간의 변환에 있어서 몇몇 편리한 산술 함수를 사용할 수 있습니다.

(Time Series section 참고)



이전글