フィルタリング
日付列のフィルタリングは、.filter
メソッドを使って他の列タイプと同じように動作します。
Polars は Python の標準の datetime
、date
、timedelta
を使って、pl.Datetime
、pl.Date
、pl.Duration
データ型間の等価比較を行います。
次の例では、Apple の株価時系列データを使います。
import polars as pl
from datetime import datetime
df = pl.read_csv("docs/data/apple_stock.csv", try_parse_dates=True)
print(df)
CsvReader
· Available on feature csv
let df = CsvReader::from_path("docs/data/apple_stock.csv")
.unwrap()
.with_try_parse_dates(true)
.finish()
.unwrap();
println!("{}", &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 │
└────────────┴────────┘
単一の日付でのフィルタリング
希望の日付文字列を Date
オブジェクトにキャストすることで、単一の日付でフィルタリングできます:
shape: (1, 2)
┌────────────┬───────┐
│ Date ┆ Close │
│ --- ┆ --- │
│ date ┆ f64 │
╞════════════╪═══════╡
│ 1995-10-16 ┆ 36.13 │
└────────────┴───────┘
ここでは、大文字の Datetime
データ型ではなく、小文字の datetime
メソッドを使用していることに注意してください。
日付範囲でのフィルタリング
開始日と終了日を使って is_between
メソッドを使うことで、日付範囲でフィルタリングできます:
filtered_range_df = df.filter(
pl.col("Date").is_between(datetime(1995, 7, 1), datetime(1995, 11, 1)),
)
print(filtered_range_df)
let filtered_range_df = df
.clone()
.lazy()
.filter(
col("Date")
.gt(lit(NaiveDate::from_ymd_opt(1995, 7, 1).unwrap()))
.and(col("Date").lt(lit(NaiveDate::from_ymd_opt(1995, 11, 1).unwrap()))),
)
.collect()?;
println!("{}", &filtered_range_df);
shape: (2, 2)
┌────────────┬───────┐
│ Date ┆ Close │
│ --- ┆ --- │
│ date ┆ f64 │
╞════════════╪═══════╡
│ 1995-07-06 ┆ 47.0 │
│ 1995-10-16 ┆ 36.13 │
└────────────┴───────┘
負の日付でのフィルタリング
考古学者と一緒に仕事をしていて、負の日付を扱っているとします。
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)
str.replace_all
· Available on feature dtype-date
let negative_dates_df = df!(
"ts"=> &["-1300-05-23", "-1400-03-02"],
"values"=> &[3, 4])?
.lazy()
.with_column(col("ts").str().to_date(StrptimeOptions::default()))
.collect()?;
let negative_dates_filtered_df = negative_dates_df
.clone()
.lazy()
.filter(col("ts").dt().year().lt(-1300))
.collect()?;
println!("{}", &negative_dates_filtered_df);
shape: (1, 2)
┌─────────────┬────────┐
│ ts ┆ values │
│ --- ┆ --- │
│ date ┆ i64 │
╞═════════════╪════════╡
│ -1400-03-02 ┆ 4 │
└─────────────┴────────┘