解析
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]