解析

Polars原生支持解析时间序列数据, 并支持执行更复杂的操作, 例如时间分组和重采样.

数据类型

Polars具有以下日期时间数据类型

  • Date, 示例: 2015-07-05, 内部表示为自unix纪元以来的天数
  • Datetime, 示例: 2014-07-08 07:00:00, 在内部使用64位整数表示自unix纪元以来过了多少时间, 支持不同的单位, 比如ns,us,ms
  • Duration, 表示时间差, 是Date-Date,Datetime-Datetime之间的差
  • Time, 表示一天中的某几个时刻, 比如: 07:00:00, 内部用纳秒表示从午夜(00:00:00)开始过了多少时间

从文件中解析时间

parse_time_from_file.csv

默认解析

如果不指定try_parse_dates=True, Polars不会解析为时间格式

1import polars as pl
2
3df = pl.read_csv("./parse_time_from_file.csv")
4
5print(df)

可以看到默认是字符串类型

1shape: (6, 2)
2┌────────────┬────────┐
3│ Date       ┆ Close  │
4│ ---        ┆ ---    │
5│ str        ┆ f64    │
6╞════════════╪════════╡
7│ 1982-02-23 ┆ 24.62  │
8│ 1982-05-06 ┆ 27.38  │
9│ 1981-05-18 ┆ 28.0   │
10│ 1981-09-25 ┆ 14.25  │
11│ 2013-11-07 ┆ 512.49 │
12│ 2014-02-25 ┆ 522.06 │
13└────────────┴────────┘

指定解析为时间格式

从csv文件加载数据时, 如果设置try_parse_dates=True, Polars会尝试解析日期和时间, 设置这个标识时, infer_schema_length默认为100行触发推断模式, 计算成本有些高, 如果行数较多, 可能会降低文件加载速度

1import polars as pl
2
3df = pl.read_csv(
4    "./parse_time_from_file.csv",
5    try_parse_dates=True
6)
7print(df)

可以看到下面结果中的第五行是date数据类型

1shape: (6, 2)
2┌────────────┬────────┐
3│ Date       ┆ Close  │
4│ ---        ┆ ---    │
5│ date       ┆ f64    │
6╞════════════╪════════╡
7│ 1982-02-23 ┆ 24.62  │
8│ 1982-05-06 ┆ 27.38  │
9│ 1981-05-18 ┆ 28.0   │
10│ 1981-09-25 ┆ 14.25  │
11│ 2013-11-07 ┆ 512.49 │
12│ 2014-02-25 ┆ 522.06 │
13└────────────┴────────┘

将字符串转换为日期

将一列编码为字符串的日期时间转换为日期类型, 可以使用pl.col("col").str.to_date()

1import polars as pl
2
3df = pl.read_csv("./parse_time_from_file.csv")
4
5df = df.with_columns(pl.col("Date").str.to_date("%Y-%m-%d"))
6
7print(df)
1shape: (6, 2)
2┌────────────┬────────┐
3│ Date       ┆ Close  │
4│ ---        ┆ ---    │
5│ date       ┆ f64    │
6╞════════════╪════════╡
7│ 1982-02-23 ┆ 24.62  │
8│ 1982-05-06 ┆ 27.38  │
9│ 1981-05-18 ┆ 28.0   │
10│ 1981-09-25 ┆ 14.25  │
11│ 2013-11-07 ┆ 512.49 │
12│ 2014-02-25 ┆ 522.06 │
13└────────────┴────────┘

从日期列中提取日期特征

我们可以使用命名空间.dt从日期列中提取年份或者日期等数据特征

1import polars as pl
2
3df = pl.read_csv("./parse_time_from_file.csv")
4
5df = df.with_columns(pl.col("Date").str.to_date("%Y-%m-%d"))
6df_with_year = df.with_columns(
7	    pl.col("Date")
8	    .dt.year()
9		.alias("year")
10)
11
12print(df_with_year)
1shape: (6, 3)
2┌────────────┬────────┬──────┐
3│ Date       ┆ Close  ┆ year │
4│ ---        ┆ ---    ┆ ---  │
5│ date       ┆ f64    ┆ i32  │
6╞════════════╪════════╪══════╡
7│ 1982-02-23 ┆ 24.62  ┆ 1982 │
8│ 1982-05-06 ┆ 27.38  ┆ 1982 │
9│ 1981-05-18 ┆ 28.0   ┆ 1981 │
10│ 1981-09-25 ┆ 14.25  ┆ 1981 │
11│ 2013-11-07 ┆ 512.49 ┆ 2013 │
12│ 2014-02-25 ┆ 522.06 ┆ 2014 │
13└────────────┴────────┴──────┘

混合时差

1data = [
2    "2021-03-27T00:00:00+0100",
3    "2021-03-28T00:00:00+0100",
4    "2021-03-29T00:00:00+0200",
5    "2021-03-30T00:00:00+0200",
6]
7mixed_parsed = (
8    pl.Series(data)
9    .str.to_datetime("%Y-%m-%dT%H:%M:%S%z")
10    .dt.convert_time_zone("Europe/Brussels")
11)
12print(mixed_parsed)
1shape: (4,)
2Series: '' [datetime[μs, Europe/Brussels]]
3[
4    2021-03-27 00:00:00 CET
5    2021-03-28 00:00:00 CET
6    2021-03-29 00:00:00 CEST
7    2021-03-30 00:00:00 CEST
8]