필터링

필터링 (Filtering)

날짜 칼럼을 필터링하는 건 다른 타입의 칼럼을 필터링하는 것과 똑같아요. 다만 날짜/시간 타입은 비교 방식에 조금 특별한 점이 있어서, 그 부분을 중심으로 살펴볼게요. 예시는 Apple 주식 가격 시계열을 사용할게요.

출처: 공식문서

날짜 칼럼을 필터링하는 것은 다른 타입의 칼럼과 동일하게 .filter 메서드를 사용해서 동작합니다.

Polars는 pl.Datetime, pl.Date, pl.Duration 데이터 타입 사이의 동등 비교에 Python의 내장 datetime, date, timedelta를 사용해요.

아래 예시에서 Apple 주식 가격 시계열을 사용합니다.

import polars as pl
from datetime import datetime

df = pl.read_csv("docs/assets/data/apple_stock.csv", try_parse_dates=True)
print(df)
shape: (100, 2)
┌──────────┬────────┐
│ Date     ┆ Close  │
│ ---      ┆ ---    │
│ date     ┆ f64    │
╞══════════╪════════╡
│ 1981-02-23 ┆ 24.62  │
│ 1981-05-06 ┆ 27.38  │
│ 1981-05-18 ┆ 28.0   │
│ 1981-09-25 ┆ 14.25  │
│ 1982-07-08 ┆ 11.0   │
│ …        ┆ …      │
│ 2012-05-16 ┆ 546.08 │
│ 2012-12-04 ┆ 575.85 │
│ 2013-07-05 ┆ 417.42 │
│ 2013-11-07 ┆ 512.49 │
│ 2014-02-25 ┆ 522.06 │
└──────────┴────────┘

단일 날짜로 필터링 (Filtering by single dates)

필터 표현식에서 동등 비교를 사용해 단일 날짜로 필터링할 수 있어요:

filtered_df = df.filter(
    pl.col("Date") == datetime(1995, 10, 16),
)
print(filtered_df)
shape: (1, 2)
┌──────────┬───────┐
│ Date     ┆ Close │
│ ---      ┆ ---   │
│ date     ┆ f64   │
╞══════════╪═══════╡
│ 1995-10-16 ┆ 36.13  │
└──────────┴───────┘

여기서 대문자 Datetime 데이터 타입이 아니라 소문자 datetime 메서드를 쓰고 있다는 점을 눈여겨보세요.

날짜 범위로 필터링 (Filtering by a date range)

필터 표현식에서 is_between 메서드에 시작 날짜와 끝 날짜를 넘겨 날짜 범위로 필터링할 수 있어요:

filtered_range_df = df.filter(
    pl.col("Date").is_between(datetime(1995, 7, 1), datetime(1995, 11, 1)),
)
print(filtered_range_df)
shape: (2, 2)
┌──────────┬───────┐
│ Date     ┆ Close │
│ ---      ┆ ---   │
│ date     ┆ f64   │
╞══════════╪═══════╡
│ 1995-07-06 ┆ 47.0   │
│ 1995-10-16 ┆ 36.13  │
└──────────┴───────┘

음수 날짜로 필터링 (Filtering with negative dates)

고고학자와 함께 일하면서 음수 날짜(BC)를 다룬다고 가정해 볼게요. Polars는 그것들을 문제없이 파싱하고 저장할 수 있지만, Python datetime 라이브러리는 그렇게 하지 못해요. 그래서 필터링할 때는 .dt 네임스페이스의 속성을 사용해야 합니다:

ts = pl.Series(["-1300-05-23", "-1400-03-02"]).str.to_date()

negative_dates_df = pl.DataFrame({"ts": ts, "values": [3, 4]})

negative_dates_filtered_df = negative_dates_df.filter(pl.col("ts").dt.year() < -1300)
print(negative_dates_filtered_df)

더 알아보기 (Learn more)

  • 날짜/시간 데이터를 문자열에서 파싱하는 방법은 파싱 (Parsing) 문서를 참고하세요.