시간대
시간대 (Time zones)
시간대는 다루기 어려운 주제라서, 가능하면 아예 안 건드리는 게 최선이라는 말도 있어요. 그런데 실제 데이터에는 UTC나 특정 지역 시간대가 어쩔 수 없이 따라붙죠. Polars는 Datetime 타입에 시간대를 연결해 저장하고, 시간대 사이를 변환하는 메서드를 제공합니다. 이 섹션에서는 시간대를 설정하고 변환하는 두 핵심 메서드를 살펴볼게요.
출처: 공식문서
Tom Scott: You really should never, ever deal with time zones if you can help it.
Datetime 데이터 타입에는 시간대(time zone)가 연결될 수 있어요. 유효한 시간대의 예시는 다음과 같습니다:
None: 시간대 없음. "시간대 비인지(naive)"라고도 함.UTC: 협정 세계시 (Coordinated Universal Time).Asia/Kathmandu: "지역/위치" 형식의 시간대. tz 데이터베이스 시간대 목록에서 사용 가능한 것을 볼 수 있어요.
주의: +02:00 같은 고정 오프셋(fixed offset)은 시간대 처리에 사용하면 안 됩니다. 위에서 언급한 "Area/Location" 형식을 사용하는 것이 권장되는데, 그것이 시간대를 더 효과적으로 관리할 수 있기 때문이에요.
Datetime은 단일 시간대만 가질 수 있기 때문에, 여러 시간대를 가진 칼럼을 만드는 것은 불가능하다는 점에 주의하세요. 여러 오프셋이 있는 데이터를 파싱한다면 utc=True를 넘겨 모두 공통 시간대(UTC)로 변환하고 싶을 거예요. — 날짜와 시간 파싱을 참고하세요.
시간대를 설정하고 변환하는 주요 메서드는 다음과 같아요:
dt.convert_time_zone: 한 시간대에서 다른 시간대로 변환.dt.replace_time_zone: 시간대를 설정/해제/변경.
일반적인 연산의 몇 가지 예시를 볼게요:
import polars as pl
ts = ["2021-03-27 03:00", "2021-03-28 03:00"]
tz_naive = pl.Series("tz_naive", ts).str.to_datetime()
tz_aware = tz_naive.dt.replace_time_zone("UTC").rename("tz_aware")
time_zones_df = pl.DataFrame([tz_naive, tz_aware])
print(time_zones_df)
shape: (2, 2)
┌─────────────────────┬─────────────────────┐
│ tz_naive ┆ tz_aware │
│ --- ┆ --- │
│ datetime[μs] ┆ datetime[μs, UTC] │
╞═════════════════════╪═════════════════════╡
│ 2021-03-27 03:00:00 ┆ 2021-03-27 03:00:00 ┆
│ 2021-03-28 03:00:00 ┆ 2021-03-28 03:00:00 ┆
└─────────────────────┴─────────────────────┘
time_zones_operations = time_zones_df.select(
[
pl.col("tz_aware")
.dt.replace_time_zone("Europe/Brussels")
.alias("replace time zone"),
pl.col("tz_aware")
.dt.convert_time_zone("Asia/Kathmandu")
.alias("convert time zone"),
pl.col("tz_aware").dt.replace_time_zone(None).alias("unset time zone"),
]
)
print(time_zones_operations)
첫 번째 예시에서 tz_naive(시간대 없는 naive datetime)에 replace_time_zone("UTC")를 적용해 tz_aware를 만들었어요. 두 번째 예시에서는 replace_time_zone으로 시간대를 바꾸거나 None으로 설정 해제하고, convert_time_zone으로 실제 시각을 유지한 채 시간대만 변환하는 차이를 확인할 수 있어요.
더 알아보기 (Learn more)
- 날짜/시간 타입에 시간대를 붙이기 전 문자열 파싱은 파싱 (Parsing) 문서를 참고하세요.
- 정렬 전 데이터 준비 단계에서 날짜 시계열 전반을 다루는 법은 시계열 변환 문서들을 참고하세요.