time
: 기준이 될 시간 입니다.
asof
: 현재 미사용 입니다.
axis
: 기준이 될 축 입니다.
i = pd.date_range('2021-12-24', periods=10, freq='6H')
# 2021-12-24를 시작으로 10기간(간격 6H)의 데이터 생성.
# 2021-12-24를 시작으로 periods=10 (10개까지 출력) freq='6H'(6시간 간격으로)
df = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10]}, index=i)
print(df)
>>
col1
2021-12-24 00:00:00 1
2021-12-24 06:00:00 2
2021-12-24 12:00:00 3
2021-12-24 18:00:00f4
2021-12-25 00:00:00 5
2021-12-25 06:00:00 6
2021-12-25 12:00:00 7
2021-12-25 18:00:00 8
2021-12-26 00:00:00 9
2021-12-26 06:00:00 10
기본적인 사용법
위 시간에 대해서 시간이 06:00
인 값만 출력해보도록 하겠습니다.
print(df.at_time('06:00'))
>>
col1
2021-12-24 06:00:00 2
2021-12-25 06:00:00 6
2021-12-26 06:00:00 10
df.between_time(start_time, end_time, include_start=True, include_end=True, axis=None)
start_time
: 기준이 될 시작 시간입니다.
end_time
: 기준이 될 끝 시간입니다.
include_start
: 시작 시간을 포함할지 여부입니다.
inclusive_end
: 끝 시간을 포함할지 여부입니다.
axis
: 기준이 될 축 입니다.
i = pd.date_range('2021-12-24', periods=10, freq='1H')
df = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10]}, index=i)
print(df)
>>
col1
2021-12-24 00:00:00 1
2021-12-24 01:00:00 2
2021-12-24 02:00:00 3
2021-12-24 03:00:00 4
2021-12-24 04:00:00 5
2021-12-24 05:00:00 6
2021-12-24 06:00:00 7
2021-12-24 07:00:00 8
2021-12-24 08:00:00 9
2021-12-24 09:00:00 10
3시에서 6시 사이만 출력
print(df.between_time(start_time='03:00',end_time='06:00'))
>>
col1
2021-12-24 03:00:00 4
2021-12-24 04:00:00 5
2021-12-24 05:00:00 6
2021-12-24 06:00:00 7
print(df.between_time(start_time='03:00',end_time='06:00',inclusive= 'neither'))
>>
col1
2021-12-24 04:00:00 5
2021-12-24 05:00:00 6
# 03:00과 06:00이 제외됨.
'both' (기본값): 시작과 끝 모두 포함
'left': 시작 시간만 포함
'right': 끝 시간만 포함
'neither': 둘 다 포함하지 않음
해당 시간을 제외한 시간 필터링
start_time
을 end_time
보다 늦은 시간으로 둘 경우, 두 시간사이를 제외한 값을 출력합니다.
print(df.between_time(start_time='06:00',end_time='03:00'))
# start_time이 end_time보다 늦음
>>
col1
2021-12-24 00:00:00 1
2021-12-24 01:00:00 2
2021-12-24 02:00:00 3
2021-12-24 03:00:00 4
2021-12-24 06:00:00 7
2021-12-24 07:00:00 8
2021-12-24 08:00:00 9
2021-12-24 09:00:00 10
#03:00 ~ 06:00을 제외한 시간이 출력됨.
i = pd.date_range('2021-12-06', periods=5, freq='3D')
# 2021-12-06을 시작일로 3일 간격의 5개 날짜 데이터를 생성
df = pd.DataFrame({'col1':[1,2,3,4,5]}, index=i)
print(df)
>>
col1
2021-12-06 1
2021-12-09 2
2021-12-12 3
2021-12-15 4
2021-12-18 5
기본적인 사용법
offset
은 기준이 될 기간
을 선택합니다. 출력할 갯수가 아님을 명심해야합니다.
print(df.first('4D'))
>>
col1
2021-12-06 1
2021-12-09 2
# 첫날짜 기준으로 4일간의 데이터를 필터링함. 4개 날짜의 출력이 아니라 4일동안.
last
메서드의 경우도 동일합니다.
Copyprint(df.last('4D'))
>>
col1
2021-12-15 4
2021-12-18 5
# 마지막 날짜 기준으로 4일간의 데이터를 필터링.
tz
: 변경의 대상이 되는 시간대 입니다.
level
: 멀티인덱스의 경우 레벨을 지정할 수 있습니다.
copy
: 사본을 생성할지 여부입니다.
dr = pd.date_range(start='2021-12-29 09:00', freq='H', periods=4, tz='US/Eastern')
# date_range를 통해 기본 시간과 간격을 설정하고, tz인수를통해 timezone을 지정.
df=pd.DataFrame(index=dr, data={'Seoul':[0,0,0,0],'None':[0,0,0,0]})
print(df)
>>
Seoul None
2021-12-29 09:00:00-05:00 0 0
2021-12-29 10:00:00-05:00 0 0
2021-12-29 11:00:00-05:00 0 0
2021-12-29 12:00:00-05:00 0 0
<ipython-input-17-28825d943d68>:1: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
dr = pd.date_range(start='2021-12-29 09:00', freq='H', periods=4, tz='US/Eastern')
기본적인 사용법
단순히 원하는timezone
을 지정함으로서 시간대의 변경이 가능합니다.
기본적으로 지역(대륙)/도시
형식으로 지원되며, 첫글자는 대문자여야 합니다. Asia/Seoul
을 통해 서울 표준시로 변경해보겠습니다.
data1 = dr.tz_convert('Asia/Seoul')
# 지역/도시명 으로 표준시를 변경할 수 있습니다.
data2 = dr.tz_convert(None)
# None을 입력할 경우 시간대가 삭제됩니다.
df = pd.DataFrame(data={'Seoul':data1,'None':data2},index=dr)
print(df)
>>
Seoul None
2021-12-29 09:00:00-05:00 2021-12-29 23:00:00+09:00 2021-12-29 14:00:00
2021-12-29 10:00:00-05:00 2021-12-30 00:00:00+09:00 2021-12-29 15:00:00
2021-12-29 11:00:00-05:00 2021-12-30 01:00:00+09:00 2021-12-29 16:00:00
2021-12-29 12:00:00-05:00 2021-12-30 02:00:00+09:00 2021-12-29 17:00:00
tz
: 변경의 대상이 되는 시간대 입니다.
axis
: 변경을 진행할 축 입니다..
copy
: 사본을 생성할지 여부입니다.
ambiguous
: DST(일광절약시) 즉, 서머타임이 적용될 경우 시간대가 꼬일 수 있습니다. 한쪽은 DST를 적용하는데, 한쪽은 적용하지 않는경우 등입니다.
이 때, ambiguous
인수를 통해 모호한 시간 처리를 할 수 있습니다.
infer 은 가을-DST 전환 시간을 추론합니다.
True인 경우 DST시간대이며, False인 경우 DST시간대가 아닌 경우입니다.
NaT인 경우 모호한 시간대면 NaT를 반환합니다.
raise인 경우 모호한 시간대면 AmbiguousTimeError를 발생시킵니다.
nonexistent
: DST를통해 시간이 당겨질 경우, 특정시간대는 존재하지 않을 수 있습니다.
shift_forward인 경우 존재하지 않는 시간을 가장 가까운 시간대로 당겨서 출력합니다.
shift_backward인 경우 존재하지 않는 시간을 가장 가까운 시간대로 미뤄서 출력합니다.
NaT인 경우 존재하지 않는 시간을 NaT로 출력합니다.
Timedelta값을 입력하는 경우 Timedelta값 만큼 이동합니다.
raise인 경우 존재하지 않는 시간이 발생하면 NonExistentTimeError를 발생시킵니다.
tz_convert
의 예시와 같지만, date_range
생성 단계에서 tz인수를 삭제하여 시간대를 설정하지 않고 진행해보겠습니다.
dr = pd.date_range(start='2021-12-29 09:00', freq='H', periods=4)
# tz인수를 삭제하여 시간대 미설정으로 진행
df=pd.DataFrame(index=dr, data={'Seoul':[0,0,0,0],'None':[0,0,0,0]})
print(df)
>>
Seoul None
2021-12-29 09:00:00 0 0
2021-12-29 10:00:00 0 0
2021-12-29 11:00:00 0 0
2021-12-29 12:00:00 0 0
기본적인 사용법
이 상태에서 tz_convert
를 진행하면 tz_convert raise TypeError가 발생합니다.
기존 시간대가 지정되어있지 않기 때문에 tz_convert를 진행하지 못하기 때문입니다.
data1 = dr.tz_convert('Asia/Seoul')
>>
Traceback (most recent call last):
...
TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize
바로 이 경우에 tz_localize
메서드를 통해 시간대를 지정해줄 수 있습니다.
dr = pd.date_range(start='2021-12-29 09:00', freq='H', periods=4)
dr = dr.tz_localize('US/Eastern') # 설정된 dr에 시간대를 설정
df = pd.DataFrame(index=dr, data={'Seoul':[0,0,0,0],'None':[0,0,0,0]})
print(df)
>>
Seoul None
2021-12-29 09:00:00-05:00 0 0 # 정상적으로 시간대가 설정됨
2021-12-29 10:00:00-05:00 0 0
2021-12-29 11:00:00-05:00 0 0
2021-12-29 12:00:00-05:00 0 0
#tz_localize메서드를 통해서 Asia/seoul을 US/Eastern으로 변경한것을 확인 할 수 있다
이제 tz_convert
를 진행하면 정상적으로 되는것을 확인할 수 있습니다.
data1 = dr.tz_convert('Asia/Seoul')
data2 = dr.tz_convert(None)
df = pd.DataFrame(data={'Seoul':data1,'None':data2},index=dr)
print(df)
>>
Seoul None
2021-12-29 09:00:00-05:00 2021-12-29 23:00:00+09:00 2021-12-29 14:00:00
2021-12-29 10:00:00-05:00 2021-12-30 00:00:00+09:00 2021-12-29 15:00:00
2021-12-29 11:00:00-05:00 2021-12-30 01:00:00+09:00 2021-12-29 16:00:00
2021-12-29 12:00:00-05:00 2021-12-30 02:00:00+09:00 2021-12-29 17:00:00
즉, 요약하자면 TimeStamp나 DateRange를 생성할 때 tz인수를 입력하는것과
만들어진 객체에 tz_localize
인수를 통해 시간대를 설정하는것은 동일한 결과를 가집니다.
※아래 두 경우는 동일함
dr = pd.date_range(start='2021-12-29 09:00', freq='H', periods=4, tz='US/Eastern')
dr = pd.date_range(start='2021-12-29 09:00', freq='H', periods=4).tz_localize('US/Eastern')
freq
: timestamp로의 기준이 되는 주기 입니다. [Y/M/D, H/T(min)/S 등등..], 더 많은 freq항목은 이 링크의 DateOffset objects 항목에서 확인 바랍니다.
how
: {start / end} 기간의 시작을 기준으로할지, 끝을 기준으로 할지 정합니다.
axis
: 기준이 될 축을 지정합니다.
copy
: 사본을 생성할지 여부입니다.
pd.period_range
를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.
period = pd.period_range(start='2021-10-04 00:00:00',end='2021-10-04 01:00:00',freq='30T')
# 2021-10-04 00:00:00부터 2021-10-04 01:00:00 까지 30분 단위로 인덱스 생성
# 여기서 T는 min을 의미합니다.
df=pd.DataFrame(data=range(len(period)),index=period)
print(df)
>>
0
2021-10-04 00:00 0
2021-10-04 00:30 1
2021-10-04 01:00 2
기본적인 사용법
먼저 how=start
로 하여 시작시간을 기준으로 freq를 변경해가면서 datetime index가 어떻게 timestamp화되는지 확인해보겠습니다.
print(df.to_timestamp(freq="S",how='start'))
>>
0
2021-10-04 00:00:00 0
2021-10-04 00:30:00 1
2021-10-04 01:00:00 2
print(df.to_timestamp(freq="T",how='start'))#= T는 (min)분으로 month가 M을 가져갔기 때문에 T로 대체되었
>>
0
2021-10-04 00:00:00 0
2021-10-04 00:30:00 1
2021-10-04 01:00:00 2
print(df.to_timestamp(freq="H",how='start'))
>>
0
2021-10-04 00:00:00 0
2021-10-04 00:00:00 1
2021-10-04 01:00:00 2
print(df.to_timestamp(freq="D",how='start'))
>>
0
2021-10-04 0
2021-10-04 1
2021-10-04 2
print(df.to_timestamp(freq="M",how='start'))
>>
0
2021-10-31 0
2021-10-31 1
2021-10-31 2
print(df.to_timestamp(freq="Y",how='start'))
>>
0
2021-12-31 0
2021-12-31 1
2021-12-31 2
how=start
와 how=end
를 비교하여 index가 어떻게 변화하는지 확인 할 수 있습니다.
Copyprint(df.to_timestamp(freq="T",how='start'))
print(df.to_timestamp(freq="T",how='end'))
>>
0
2021-10-04 00:00:00 0
2021-10-04 00:30:00 1
2021-10-04 01:00:00 2
0
2021-10-04 00:29:59.999999999 0
2021-10-04 00:59:59.999999999 1
2021-10-04 01:29:59.999999999 2
freq
: 기준이 될 주기 입니다.
method
: {bfill / ffill} 리샘플링으로 생성된 빈(NaN) 값을 채울 방식입니다.
bfill : 아래 값으로 빈 값을 채웁니다.
ffill : 위 값으로 빈 값을 채웁니다.
how
: {start / end} period Index에서 사용하는 방식입니다. 유사한 것을 to_timestamp
에서 볼 수 있습니다.
normalize
: {True / False} 출력되는 인덱스를 자정으로 설정할지 여부입니다.
fill_value
: 리샘플링으로 생성된 빈(NaN) 값을 채울 값입니다.
먼저 기본적인 사용법 예시를위하여 3x1짜리 데이터를 만들어보겠습니다.
pd.date_range
를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.
idx = pd.date_range('2021-12-30',periods=3,freq='min')
# 2021-12-30 기준으로 1분 간격의 3개 값 만듦
df = pd.DataFrame(index=idx, data=[1,None,3],columns=['col'])
# 값중 하나는 의도적으로 NaN입력
print(df)
>>
col
2021-12-30 00:00:00 1.0
2021-12-30 00:01:00 NaN
2021-12-30 00:02:00 3.0
기본적인 사용법
먼저 freq=30S
로 하여 1분간격의 데이터를 30초 간격으로 리샘플링 해보겠습니다.
print(df.asfreq(freq='30S'))
>>
col
2021-12-30 00:00:00 1.0
2021-12-30 00:00:30 NaN
2021-12-30 00:01:00 NaN
2021-12-30 00:01:30 NaN
2021-12-30 00:02:00 3.0
# 30초 단위의 인덱스가 생성되며 값은 NaN으로 채워짐
결측치 채우기(method / fill_value)
method
를 통해 빈 값을 앞이나 뒤의 값으로 채울 수 있으며, fill_value
를 통해 지정된 값으로 채울 수 있습니다.
method='bfill'
으로 뒤의 값으로 결측치 채우기
print(df.asfreq(freq='30S',method='bfill'))
>>
col
2021-12-30 00:00:00 1.0
2021-12-30 00:00:30 NaN
2021-12-30 00:01:00 NaN
2021-12-30 00:01:30 3.0
2021-12-30 00:02:00 3.0
method='ffill'
으로 앞의 값으로 결측치 채우기
print(df.asfreq(freq='30S',method='ffill'))
>>
col
2021-12-30 00:00:00 1.0
2021-12-30 00:00:30 1.0
2021-12-30 00:01:00 NaN
2021-12-30 00:01:30 NaN
2021-12-30 00:02:00 3.0
fill_value
를 입력하여 결측치를 채우기
print(df.asfreq(freq='30S',fill_value='-'))
>> col
2021-12-30 00:00:00 1.0
2021-12-30 00:00:30 -
2021-12-30 00:01:00 NaN
2021-12-30 00:01:30 -
2021-12-30 00:02:00 3.0
자정 기준으로 변경(normalize)
normalize
인수를 통해 시간기준을 자정(00:00:00)으로 고정할 수 있습니다.
예시를 위해 날짜 기준으로 3일치 데이터를 만들어보겠습니다.
idx = pd.date_range('2021-12-20',periods=3,freq='D')
df = pd.DataFrame(index=idx, data=[1,2,3],columns=['col'])
print(df)
>>
col
2021-12-20 1
2021-12-21 2
2021-12-22 3
이제 이 데이터를 asfreq
를 통해 8시간 기준으로 리샘플링 해보겠습니다.
print(df.asfreq(freq='8H'))
>>
col
2021-12-20 00:00:00 1.0
2021-12-20 08:00:00 NaN
2021-12-20 16:00:00 NaN
2021-12-21 00:00:00 2.0
2021-12-21 08:00:00 NaN
2021-12-21 16:00:00 NaN
2021-12-22 00:00:00 3.0
이제 normalize=True
를 하여 시간대를 자정으로 고정해보겠습니다.
print(df.asfreq(freq='8H',normalize=True))
>>
col
2021-12-20 1.0
2021-12-20 NaN
2021-12-20 NaN
2021-12-21 2.0
2021-12-21 NaN
2021-12-21 NaN
2021-12-22 3.0
rule
: 리샘플링 할 기준 입니다. 단위로는 Y, M, D, H, T(min), S ...
등을 조합하여 사용할 수 있습니다.
axis
: 리샘플링할 축 입니다.
closed
: {left / right} 간격의 시작과 끝중 어느부분을 닫을지 입니다. 기본적으로 왼쪽(시작) 입니다.
간단히 예를들면 1분간격 인터벌로 01:00의 값이 1이라고하면 left는 시작부분을 닫아 01:00≤ x<02:00인 시간의 값을 1으로,
right는 끝 부분을 닫아 00:00<x ≤01:00인 시간의 값을 10이라고 판단하는 것입니다.
label
: {left / right} 리샘플링될 시간을 포함하는 간격의 어떤 가장자리를 레이블로 정할지 입니다. 기본적으로 왼쪽 입니다.
convection
: {start, end, s, e} PeriodIndex의 경우에만 규칙의 시작 또는 끝을 사용할지 여부를 제어합니다.
kind
: {timestamp / period} 결과 인덱스를 DateTimeIndex로 변환하려면 'timestamp'를 전달하고 PeriodIndex로 변환하려면 'period'를 전달합니다. loffset
: 리샘플링된 시간 레이블을 조정하는 인수로 현재는 사용하지 않습니다. (offset
인수로 대체)
base
: 리샘플링한 데이터의 간격의 원점을 지정하는 인수로, 현재 사용하지 않습니다.(origin
인수로 대체)
on
: 인덱스가 아닌 열 기준으로 리샘플링을 시도할 경우, 해당 열의 이름을 지정하는 인수 입니다.
level
: 멀티인덱스(Multi Index)의 경우 리샘플링할 인덱스의 레벨을 지정하는 인수 입니다.
origin
: {epoch, start, start_day, end, end_day / Timestamp} 리샘플링할 경우 데이터 간격의 원점을 지정합니다.
epoch : 1970-01-01을 기준으로 간격을 설정합니다.
start : 인덱스의 첫 번째 값을 기준으로 간격을 설정합니다.
start_day : 인덱스의 첫 번째 값이 포함되는 날의 자정을 기준으로 간격을 설정합니다.
end : 인덱스의 마지막 값을 기준으로 간격을 설정합니다.
end_day : 인덱스의 마지막 값이 포함되는 나르이 자정을 기준으로 간격을 설정합니다.
Timestamp : 지정한 시간(Timestamp)를 기준으로 간격을 설정합니다.
offset
: origin의 값에 시간 오프셋을 더해줍니다.
먼저 기본적인 사용법 예시를위하여 10x1짜리 데이터를 만들어보겠습니다.
pd.date_range
를 이용해 기준시간에 대해 일정 간격을 가진 datetime index를 생성하겠습니다.
idx = pd.date_range('2021-12-30',periods=10,freq='min')
# 2021-12-30일기준으로 1분간격의 10개의 행 생성
df = pd.DataFrame(index=idx, data=[0,1,2,3,4,5,6,7,8,9],columns=['col'])
print(df)
>>
col
2021-12-30 00:00:00 0
2021-12-30 00:01:00 1
2021-12-30 00:02:00 2
2021-12-30 00:03:00 3
2021-12-30 00:04:00 4
2021-12-30 00:05:00 5
2021-12-30 00:06:00 6
2021-12-30 00:07:00 7
2021-12-30 00:08:00 8
2021-12-30 00:09:00 9
resample
메서드는 단독으로 사용하면 DatetimeIndexResampler를 출력한다 왜냐하면 우리가 원하는 데이터를 리샘플링된 데이터를 출력하고 싶으면 다른 메서드 뒤에 붙여서, 리셈플링된 데이터의 열의 값을 지정해야한다
우리가 원하는 리샘플링된 데이터를 출력하고자 하면, 다른 메서드를 뒤에 붙여서, 리샘플링된 데이터의 열의 값을 지정해주어야합니다.
1분간격으로 1~10까지의 값을 가지는 데이터를 3분(3T or 3min) 간격으로 리샘플링하면서, 값은 합치도록 해보겠습니다.
print(df.resample(rule='3T').sum()) # 뒤에 .sum()을 붙여주어서 합쳐질 열의 값을 더해줍니다.
>>
col
2021-12-30 00:00:00 3 #3분 간격으로 리셈플링(축소되어)되어 출력한다
2021-12-30 00:03:00 12 #col 12의 값에는
2021-12-30 00:06:00 21
2021-12-30 00:09:00 9
sum()
뿐만아니라 prod()
, mean()
등 객체간 연산 에 이용되는 모든 메서드가 가능하며,
asfreq
같은 메서드등도 지원합니다.
closed인수의 사용
closed
인수는 bin(시간 간격)을 닫는 위치를 지정하는 인수로 기본적으로 left
값을 가집니다.
1분 간격 인터벌인 df값 중 2021-12-30 00:03:00 3
의 예시를 들면, left
인 경우는 03:00≤ x <04:00
인 시간간격에 3이 부여되는 것이고,
right
인 경우는 02:00< x ≤03:00
인 시간 간격에 3이 부여되는 것입니다.
아래 예시와 그림을 보면 이해가 쉽습니다.
# closed='left'인 경우
print(df.resample(rule='3T',closed='left').sum())
>>
col
2021-12-30 00:00:00 3
2021-12-30 00:03:00 12
2021-12-30 00:06:00 21
2021-12-30 00:09:00 9
Copy# closed='right'인 경우
print(df.resample(rule='3T',closed='right').sum())
>>
col
2021-12-29 23:57:00 0
2021-12-30 00:00:00 6
2021-12-30 00:03:00 15
2021-12-30 00:06:00 24
left
인 경우 00:00≤ x <03:00 인 시간대에 0,1,2가 들어가기 때문에 00:00부터 리샘플링하여 0+1+2=3 이 출력됩니다.
right
인 경우 0은 23:59:00< x ≤ 00:00:00인 시간대에 들어가므로 3분 단위 리샘플링이 23:57:00< x ≤ 00:00:00 으로 0이 출력됩니다.
아래 이미지를 보면 보다 직관적으로 이해할 수 있습니다.
label 인수의 사용
label
인수는 closed
인수보다는 개념이 간단합니다. 단순히 리샘플링된 인덱스의 간격을 대표할 값을
간격의 시작값으로할지 끝 값으로할지를 지정하는 것입니다. 기본값은 left
로 인터벌(간격)의 시작을 기준으로합니다.
# label = 'left'인 경우
print(df.resample(rule='3T',label='left').sum())
>>
col
2021-12-30 00:00:00 3 # 00:00~03:00의 간격에서 시작값인 00:00을 기준으로 지정
2021-12-30 00:03:00 12
2021-12-30 00:06:00 21
2021-12-30 00:09:00 9
# label = 'right'인 경우
print(df.resample(rule='3T',label='right').sum())
>>
col
2021-12-30 00:03:00 3 # 00:00~03:00의 간격에서 끝값인 03:00을 기준으로 지정
2021-12-30 00:06:00 12
2021-12-30 00:09:00 21
2021-12-30 00:12:00 9
kind 인수의 사용
kind
인수는 리샘플링된 인덱스의 dtype
을 datetime
으로 할지 peroid
로할지 정할 수 있습니다.
index의 dtype정보는 10-10 인덱스 (index) 항목에서 확인할 수 있습니다.
kind='timestamp'
인 경우 DatetimeIndex
가 됩니다.
print(df.resample(rule='3T',kind='timestamp').sum().index)
# index메서드를 통해 인덱스 정보 확인 가능
>>
DatetimeIndex(['2021-12-30 00:00:00', '2021-12-30 00:03:00',
'2021-12-30 00:06:00', '2021-12-30 00:09:00'],
dtype='datetime64[ns]', freq='3T')
# 분류가 DatetimeIndex 이며 dtype='datetime`으로 설정됨.
kind='period'
인 경우 PeriodIndex
가 됩니다.
print(df.resample(rule='3T',kind='period').sum().index)
>>
PeriodIndex(['2021-12-30 00:00', '2021-12-30 00:03', '2021-12-30 00:06',
'2021-12-30 00:09'],
dtype='period[3T]')
# 분류가 PeriodIndex 이며 dtype='period`로 설정됨.
on 인수의 사용
먼저 on
인수의 사용을 위해 열의 값이 timestamp형태인 데이터를 만들어보겠습니다.
idx = pd.date_range('2021-12-30',periods=2,freq='5min')
df = pd.DataFrame(index=idx, data=[1,6],columns=['col'])
# 5분간격의 2개 열을 가진 데이터 생성
df2 = df.reset_index(drop=False)
# reset_index를 통해 기존인덱스를 열로 변경, 새 인덱스는 0,1,2, ... , n으로 변경.
print(df2)
>>
index col
0 2021-12-30 00:00:00 1
1 2021-12-30 00:05:00 6
# 기존 index가 'index'라는 이름의 열로 바뀜
※ reset_index
에 대한 자세한 내용은 13-09 인덱스 리셋 (reset_index)을 참고 바랍니다.
on=index
를 입력하여 index라는이름을 가진 열을 기준으로 리샘플링을 진행해보겠습니다.
print(df2.resample(rule='min',on='index').sum())
# 5분간격으로 2개의 값을가지는 `index`열을 1분(min) 간격으로 리샘플링.
>>
col
index
2021-12-30 00:00:00 1 # index라는 이름의 열 기준으로 리샘플링이 진행되고
2021-12-30 00:01:00 0 # 해당 열이 index로 변경됨.
2021-12-30 00:02:00 0
2021-12-30 00:03:00 0
2021-12-30 00:04:00 0
2021-12-30 00:05:00 6
origin 인수의 사용
먼저, origin
인수와 offset
인수를 사용하기 위해 3분간격의 9행짜리 Timeindex 데이터를 만들어보겠습니다.
idx = pd.date_range('2021-12-31',periods=9,freq='3min')
df = pd.DataFrame(index=idx, data=[1,2,3,4,5,6,7,8,9],columns=['col'])
print(df)
>>
col
2021-12-31 00:00:00 1
2021-12-31 00:03:00 2
2021-12-31 00:06:00 3
2021-12-31 00:09:00 4
2021-12-31 00:12:00 5
2021-12-31 00:15:00 6
2021-12-31 00:18:00 7
2021-12-31 00:21:00 8
2021-12-31 00:24:00 9
이것을 7min 간격으로 리샘플링을 진행해보겠습니다.
print(df.resample(rule='7min').sum())
>>
col
2021-12-31 00:00:00 6
2021-12-31 00:07:00 9
2021-12-31 00:14:00 13
2021-12-31 00:21:00 17
origin
인수의 기본값은 start_day로 처음값이 포함된 날짜의 시작시간인 자정(00:00:00)을 기준으로 7분 간격으로 리샘플링을 진행합니다.
print(df.resample(rule='7min',origin='start_day').sum())
>>
col
2021-12-31 00:00:00 6
2021-12-31 00:07:00 9
2021-12-31 00:14:00 13
2021-12-31 00:21:00 17
origin='start'
인 경우 처음 값을 기준으로 7분 간격으로 리샘플링을 진행하게됩니다.
여기서는 시작시간이 00:00:00이므로 start_day
인 경우와 동일합니다.
print(df.resample(rule='7min',origin='start').sum())
>>
col
2021-12-31 00:00:00 6
2021-12-31 00:07:00 9
2021-12-31 00:14:00 13
2021-12-31 00:21:00 17
origin='epoch'
인 경우 1970-01-01을 기준으로 7분 간격의 리샘플링을 하게 됩니다.
print(df.resample(rule='7min',origin='epoch').sum())
>>
col
2021-12-30 23:55:00 1
2021-12-31 00:02:00 5
2021-12-31 00:09:00 15
2021-12-31 00:16:00 15
2021-12-31 00:23:00 9
origin='end'
인 경우 마지막 값을 기준으로 7분간격으로 리샘플링을 진행하게 됩니다.
print(df.resample(rule='7min',origin='end').sum())
>>
col
2021-12-31 00:03:00 3
2021-12-31 00:10:00 7
2021-12-31 00:17:00 11
2021-12-31 00:24:00 24
origin='end_day'
인 경우 마지막값이 포함된 날의 끝 시간인 자정(00:00:00)을 기준으로 7분 간격의 리샘플링을 진행 합니다.
print(df.resample(rule='7min',origin='end_day').sum())
>>
col
2021-12-31 00:05:00 3
2021-12-31 00:12:00 12
2021-12-31 00:19:00 13
2021-12-31 00:26:00 17
origin
값에 특정 날짜를 입력할 경우 그 날짜(시간)을 기준으로 리샘플링이 진행됩니다.
print(df.resample(rule='7min',origin='2021-12-30').sum())
>>
col
2021-12-30 23:55:00 1
2021-12-31 00:02:00 5
2021-12-31 00:09:00 15
2021-12-31 00:16:00 15
2021-12-31 00:23:00 9
offset인수의 사용
먼저 offset
인수를 사용하지 않은 경우를 보겠습니다.
print(df.resample(rule='7min').sum())
>>
col
2021-12-31 00:00:00 6
2021-12-31 00:07:00 9
2021-12-31 00:14:00 13
2021-12-31 00:21:00 17
offset
인수는 origin
에 대해서 시간을 더하는 인수입니다.
만약 offset='4min'
을 지정해준다면, 기본값인 origin='start_day'
인 첫 값이 포함된 날의 자정(00:00:00)을 기준으로
4분을 더해준 값인 00:04:00을 기준으로 리샘플링이 진행되게 되는 것입니다.
즉, origin = '2021-12-31 00:04:00'
으로 입력한 경우와 완벽히 같습니다.
print(df.resample(rule='7min',offset='4min').sum())
>>
col
2021-12-30 23:57:00 3 #00:04:00 기준으로 리샘플링이 진행됐기 때문에, 00:04:00에서 7min을 뺀 23:57부터 리샘플링이 진행됨.
2021-12-31 00:04:00 7
2021-12-31 00:11:00 11
2021-12-31 00:18:00 24