pandas에서 데이터를 날짜와 시간을 포함해 사용하는 경우, 특정 시간을 행을 추출하는 방법을 알아보겠습니다.
특정 시간의 데이터 행을 추출하기 위해서는 at_time()과 between_time() 메서드를 사용합니다.
at_time과 between_time를 간단하게 먼저 살펴보면 아래와 같습니다.
- at_time() – 특정 시간 지정
- between_time() – 특정 시전대를 지정
at_time – 특정 시간을 지정
DataFrame에 특정 시간을 지정해 데이터 행을 출력하는 at_time 사용 방법을 보겠습니다.
import pandas as pd
import datetime
i = pd.date_range('2021-01-01', periods=6, freq='8H')
# 날짜와 시간을 가진 샘플 데이터 생성
df = pd.DataFrame({'A': [0,1,2,3,4,5]},index=i)
# DataFrame에 생성한 샘플 데이터
# A
# 2021-01-01 00:00:00 0
# 2021-01-01 08:00:00 1
# 2021-01-01 16:00:00 2
# 2021-01-02 00:00:00 3
# 2021-01-02 08:00:00 4
# 2021-01-02 16:00:00 5
# 8시 0분 0초 데이터 행을 추출
print(df.at_time(datetime.time(8, 0, 0)))
결과
A
2021-01-01 08:00:00 1
2021-01-02 08:00:00 4
datetime.time()에 8시 0분 0초를 지정해 해당 시간의 데이터를 추출하고 있습니다.
at_time()을 사용해 검색하는 경우, datetime형태의 인덱스만 검색이 가능합니다.
인덱스가 날짜 형태라도 데이터 타입이 문자열일 경우에는 사용할 수 없습니다.
at_time()에 지정하는 파라미터는 문자열도 사용할 수 있습니다.
import pandas as pd
import datetime
i = pd.date_range('2021-01-01', periods=6, freq='8H')
# 날짜와 시간을 가진 샘플 데이터 생성
df = pd.DataFrame({'A': [0,1,2,3,4,5]},index=i)
# DataFrame에 생성한 샘플 데이터
# A
# 2021-01-01 00:00:00 0
# 2021-01-01 08:00:00 1
# 2021-01-01 16:00:00 2
# 2021-01-02 00:00:00 3
# 2021-01-02 08:00:00 4
# 2021-01-02 16:00:00 5
print(df.at_time('16:00'))
print('------------------------')
print(df.at_time('4PM'))
결과
A
2021-01-01 16:00:00 2
2021-01-02 16:00:00 5
------------------------
A
2021-01-01 16:00:00 2
2021-01-02 16:00:00 5
오후 4시를 16:00과 4PM 형식으로 지정해 해당 데이터만 값을 추출했습니다.
at_time()의 검색 결과가 없는 경우에는 공백의 pandas.DataFrame이 반환됩니다.
between_time – 특정 시간대 지정
DataFrame에 특정 시간대 데이터 행을 출력하는 between_time 사용 방법을 보겠습니다.
import pandas as pd
import datetime
i = pd.date_range('2021-01-01', periods=6, freq='8H5s')
# 날짜와 시간을 가진 샘플 데이터 생성
df = pd.DataFrame({'A': [0,1,2,3,4,5]},index=i)
# DataFrame에 생성한 샘플 데이터
# A
# 2021-01-01 00:00:00 0
# 2021-01-01 08:00:05 1
# 2021-01-01 16:00:10 2
# 2021-01-02 00:00:15 3
# 2021-01-02 08:00:20 4
# 2021-01-02 16:00:25 5
print(df.between_time('8:00:00', '8:00:30'))
결과
A
2021-01-01 08:00:05 1
2021-01-02 08:00:20 4
8시부터 8시 0분 30초까지 시간 범위를 지정해 데이터를 출력했습니다.
출력된 데이터는 8시 0분 10초 데이터와 8시 0분 20초 데이터가 추출되었습니다.
at_time()은 시분초가 정확히 일치하는 데이터만 추출하지만 between_time()은 시간 범위를 지정해 해당되는 데이터를 모두 추출합니다.
기본적으로 between_time에는 시작 시간과 종료 시간을 지정해 범위를 만들어서 사용합니다.
between_time() 지정한 시작시간 또는 종료 시간을 포함하고 싶지 않은 경우에는 include_start 또는 include_end를 False로 설정합니다.
import pandas as pd
import datetime
i = pd.date_range('2021-01-01', periods=6, freq='8H5s')
# 날짜와 시간을 가진 샘플 데이터 생성
df = pd.DataFrame({'A': [0,1,2,3,4,5]},index=i)
# DataFrame에 생성한 샘플 데이터
# A
# 2021-01-01 00:00:00 0
# 2021-01-01 08:00:05 1
# 2021-01-01 16:00:10 2
# 2021-01-02 00:00:15 3
# 2021-01-02 08:00:20 4
print(df.between_time('8:00:05', '8:00:20', include_start=False))
print('------------------------')
print(df.between_time('8:00:05', '8:00:20', include_end=False))
print('------------------------')
print(df.between_time('8:00:05', '8:00:20', include_start=False, include_end=False))
결과
A
2021-01-02 08:00:20 4
------------------------
A
2021-01-01 08:00:05 1
------------------------
Empty DataFrame
Columns: [A]
Index: []</b>
마지막으로 시작 시간을 종료 시간보다 과거로 설정해도 데이터가 추출됩니다.
이러한 경우에는 시간 범위가 24시간 + 종료 시간으로 설정됩니다.
import pandas as pd
import datetime
i = pd.date_range('2021-01-01', periods=6, freq='8H5s')
# 날짜와 시간을 가진 샘플 데이터 생성
df = pd.DataFrame({'A': [0,1,2,3,4,5]},index=i)
# DataFrame에 생성한 샘플 데이터
# A
# 2021-01-01 00:00:00 0
# 2021-01-01 08:00:05 1
# 2021-01-01 16:00:10 2
# 2021-01-02 00:00:15 3
# 2021-01-02 08:00:20 4
print(df.between_time('8:00:30', '8:00:00'))
결과
A
2021-01-01 00:00:00 0
2021-01-01 16:00:10 2
2021-01-02 00:00:15 3
2021-01-02 16:00:25 5
정리
DataFrame에 시간 형태로 저장된 데이터에서 시간을 지정해 해당 데이터만 추출하는 방법을 알아봤습니다.
at_time()은 지정한 시간과 완전 일치하는 데이터만 출력합니다.
between_time()은 시간 범위를 지정해, 포함된 데이터만 출력합니다.
at_time()과 between_time()로 검색해 해당되는 데이터가 존재하지 않는 경우에는 공백 DataFrame을 반환합니다.
댓글