16-05 Timezone설정[표준시간대] (tz_localize)
DataFrame.tz_localize(tz, axis=0, level=None, copy=True, ambiguous='raise', nonexistent='raise')
개요
tz_localize 메서드는 현재의 시간(Time stamp)을 시간대(Timezone)로 현지화(localize)하는 메서드 입니다.
간단히 말하면 해당 시간을 시간대로 지정하는 메서드입니다.
사용법
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.tz_localize(tz, axis=0, level=None, copy=True, ambiguous='raise', nonexistent='raise')
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를 발생시킵니다.
예시
먼저 기본적인 사용법 예시를 위하여 4x3짜리 인덱스가 시간대인 데이터를 만들어보겠습니다.
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_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')
'파이썬완전정복-Pandas DataFrame > 16. 시간' 카테고리의 다른 글
Pandas DataFrame 16-07 인덱스나누기[리샘플링] (asfreq) (0) | 2022.02.17 |
---|---|
Pandas DataFrame 16-06 TimeStamp변환(to_timestamp) (0) | 2022.02.17 |
Pandas DataFrame 16-04 Timezone변경[표준시간대] (tz_convert) (0) | 2022.02.17 |
Pandas DataFrame 16-03 처음/끝 특정기간 필터링 (first / last) (0) | 2022.02.17 |
Pandas DataFrame 16-02 특정기간 필터링 (between_time) (0) | 2022.02.17 |