시간 버킷(time_bucket) 이해하기

시간 버킷(time_bucket) 이해하기

시계열 데이터를 분석하다 보면 "5분 평균", "1시간 단위 합계"처럼 일정한 시간 간격으로 데이터를 묶어 보고 싶을 때가 많아요. TimescaleDB의 time_bucket 함수는 하이퍼테이블의 데이터를 원하는 시간 단위(예: 5분, 1시간, 3일) 버킷으로 묶어 집계하게 해 줘요. PostgreSQL의 date_bin 함수와 비슷하지만, 버킷 크기와 시작 시각을 더 유연하게 조절할 수 있어요.

출처: 공식문서 - Understand time buckets

시간 버킷이 동작하는 방식

시간 버킷팅은 데이터를 시간 간격 단위로 그룹화해요. time_bucket에서 간격 길이는 마이크로초, 밀리초, 초, 분, 시, 일, 주, 월, 년 중 무엇이든 될 수 있어요. 이 함수는 대개 GROUP BY와 함께 쓰여서, 각 버킷 안의 값들의 평균·최대·최소·합계 같은 집계를 계산해요.

Origin(기준점)

Origin은 시간 버킷이 언제 시작하고 끝나는지 정해요. 기본적으로 버킷은 데이터에서 가장 오래된 타임스탬프에서 시작하지 않아요. 더 논리적인 시각이 있는 경우가 많거든요. 예를 들어 첫 데이터 포인트를 00:37에 수집했더라도 일 단위 버킷은 자정에 시작하기를 원할 거예요. 수요일에 첫 데이터를 모았어도, 주 단위 버킷은 일요일이나 월요일부터 계산하기를 원하고요.

대신 시간은 origin에서부터 일정한 간격으로 나눠져요. 2주 버킷을 예로 들면, 버킷의 첫 가능한 시작 날짜는 origin이고 그다음 가능한 시작 날짜는 origin + 버킷 간격이에요. 첫 타임스탬프가 가능한 시작 날짜와 정확히 일치하지 않으면, 바로 앞선 시작 날짜를 버킷의 시작으로 써요.

예를 들어 데이터의 가장 오래된 타임스탬프가 2020년 4월 24일(금요일)이라고 해볼게요. 2주 간격으로 버킷하면 첫 버킷은 4월 24일이 아니라, 바로 앞선 월요일인 4월 20일도 아니에요. 이 경우 기본 origin이 2000년 1월 3일이라서, 거기서 2주 단위로 세어 도달할 수 있는 4월 13일에서 시작해요.

기본 Origin

월이나 년을 포함하지 않는 간격의 기본 origin은 2000년 1월 3일이에요. 월·년 간격은 2000년 1월 1일, 정수 시간 값은 0이 기본이에요.

이 선택은 버킷의 시간 범위를 더 직관적으로 만들어 줘요. 2000년 1월 3일은 월요일이므로 주 단위 버킷이 월요일에 시작해서 ISO 표준 달력 주 계산과 일치해요. 월·년 버킷은 2000년 1월 1일을 origin으로 써서 달력 월·년의 첫 날에 시작할 수 있어요. 다른 origin을 원하면 origin 파라미터로 직접 설정할 수 있어요. 예를 들어 주를 일요일부터 시작하려면 origin을 2000년 1월 2일(일요일)로 설정하면 돼요.

시간대(Timezone)

origin 시각은 시간 값의 데이터 타입에 따라 달라져요.

  • TIMESTAMP를 쓰면 기본적으로 버킷 시작 시각이 00:00:00에 맞춰져요. 일·주 버킷은 00:00:00에 시작하고, 더 짧은 버킷은 origin 날짜의 00:00:00에서 버킷 간격으로 세어 도달하는 시각에 시작해요.
  • TIMESTAMPTZ를 쓰면 기본적으로 버킷 시작 시각이 00:00:00 UTC에 맞춰져요. 다른 시간대에 맞추려면 timezone 파라미터를 설정하면 돼요.

더 알아보기 (Learn more)