Python polars学习-10 时间序列类型

背景

polars学习系列文章,第10篇 时间序列类型(Time series)

该系列文章会分享到github,大家可以去下载jupyter文件,进行参考学习
仓库地址:https://github.com/DataShare-duo/polars_learn

小编运行环境

import sys

print('python 版本:',sys.version.split('|')[0])
#python 版本: 3.11.9

import polars as pl

print("polars 版本:",pl.__version__)
#polars 版本: 1.2.1

日期时间类型

Polars 原生支持解析时间序列数据,而且能执行一些复杂的操作

包含的日期时间类型:

  • Date:日期类型,例如:2014-07-08,内部表示为自1970-01-01的天数,用32位有符号整数表示
  • Datetime:日期时间类型,例如:2014-07-08 07:00:00
  • Duration:时间间隔类型
  • Time:时间类型

从文件加载数据时,解析时间

从csv文件加载数据时,可以指定 try_parse_dates=True,让polars去尝试解析日期时间

df = pl.read_csv("./data/apple_stock.csv", try_parse_dates=True)
print(df)
#shape: (100, 2)
┌────────────┬────────┐
│ Date       ┆ Close  │
│ ------    │
│ date       ┆ f64    │
╞════════════╪════════╡
│ 1981-02-2324.62  │
│ 1981-05-0627.38  │
│ 1981-05-1828.0   │
│ 1981-09-2514.25  │
│ 1982-07-0811.0   │
│ …          ┆ …      │
│ 2012-05-16546.08 │
│ 2012-12-04575.85 │
│ 2013-07-05417.42 │
│ 2013-11-07512.49 │
│ 2014-02-25522.06 │
└────────────┴────────┘

字符串转换为日期时间类型

通过调用字符串的 str.to_date 方法,需要指定日期时间解析时的格式

日期时间解析格式,可参考该文档:
https://docs.rs/chrono/latest/chrono/format/strftime/index.html

df = pl.read_csv("./data/apple_stock.csv", try_parse_dates=False)

df = df.with_columns(pl.col("Date").str.to_date("%Y-%m-%d"))
print(df)
shape: (100, 2)
┌────────────┬────────┐
│ Date       ┆ Close  │
│ ------    │
│ date       ┆ f64    │
╞════════════╪════════╡
│ 1981-02-2324.62  │
│ 1981-05-0627.38  │
│ 1981-05-1828.0   │
│ 1981-09-2514.25  │
│ 1982-07-0811.0   │
│ …          ┆ …      │
│ 2012-05-16546.08 │
│ 2012-12-04575.85 │
│ 2013-07-05417.42 │
│ 2013-11-07512.49 │
│ 2014-02-25522.06 │
└────────────┴────────┘

从日期时间类型中提取特定的日期类型

比如从日期时间类型列中提取年份、日期等,通过 .dt 来提取

df_with_year = df.with_columns(pl.col("Date").dt.year().alias("year"))
print(df_with_year)
#shape: (100, 3)
┌────────────┬────────┬──────┐
│ Date       ┆ Close  ┆ year │
│ ---------  │
│ date       ┆ f64    ┆ i32  │
╞════════════╪════════╪══════╡
│ 1981-02-2324.621981 │
│ 1981-05-0627.381981 │
│ 1981-05-1828.01981 │
│ 1981-09-2514.251981 │
│ 1982-07-0811.01982 │
│ …          ┆ …      ┆ …    │
│ 2012-05-16546.082012 │
│ 2012-12-04575.852012 │
│ 2013-07-05417.422013 │
│ 2013-11-07512.492013 │
│ 2014-02-25522.062014 │
└────────────┴────────┴──────┘

混合时差

当有混合时差(例如,由于跨越夏令时),可以使用 dt.convert_time_zone 来进行转换

data = [
    "2021-03-27T00:00:00+0100",
    "2021-03-28T00:00:00+0100",
    "2021-03-29T00:00:00+0200",
    "2021-03-30T00:00:00+0200",
]
mixed_parsed = (
    pl.Series(data)
    .str.to_datetime("%Y-%m-%dT%H:%M:%S%z")
    .dt.convert_time_zone("Europe/Brussels")
)


print(mixed_parsed)
#shape: (4,)
Series: '' [datetime[μs, Europe/Brussels]]
[
	2021-03-27 00:00:00 CET
	2021-03-28 00:00:00 CET
	2021-03-29 00:00:00 CEST
	2021-03-30 00:00:00 CEST
]

日期时间数据筛选

from datetime import datetime

df = pl.read_csv("./data/apple_stock.csv", try_parse_dates=True)

print(df)
#shape: (100, 2)
┌────────────┬────────┐
│ Date       ┆ Close  │
│ ------    │
│ date       ┆ f64    │
╞════════════╪════════╡
│ 1981-02-2324.62  │
│ 1981-05-0627.38  │
│ 1981-05-1828.0   │
│ 1981-09-2514.25  │
│ 1982-07-0811.0   │
│ …          ┆ …      │
│ 2012-05-16546.08 │
│ 2012-12-04575.85 │
│ 2013-07-05417.42 │
│ 2013-11-07512.49 │
│ 2014-02-25522.06 │
└────────────┴────────┘

筛选单个日期时间对象

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

筛选一个日期范围

通过 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-0647.0  │
│ 1995-10-1636.13 │
└────────────┴───────┘

筛选 负数日期

考古领域数据可能会涉及这类日期

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)
#shape: (1, 2)
┌─────────────┬────────┐
│ ts          ┆ values │
│ ------    │
│ date        ┆ i64    │
╞═════════════╪════════╡
│ -1400-03-024      │
└─────────────┴────────┘

历史相关文章


以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货

根据提供的引用内容,我无法找到关于"python polars"的具体信息。但是,根据您提供的信息,我可以为您介绍一下Python中的pandas库,它是一个用于数据分析和处理的强大工具。 Pandas是一个开源的Python库,提供了高性能、易于使用的数据结构和数据分析工具。它主要用于处理和分析结构化数据,例如表格数据。Pandas提供了两种主要的数据结构:Series和DataFrame。 Series是一维的标记数组,类似于带有标签的数组或列表。它可以包含任何数据类型,并且可以通过标签进行索引。 DataFrame是一个二维的表格数据结构,类似于电子表格或SQL表。它由行和列组成,每列可以包含不同的数据类型。DataFrame可以从多种数据源创建,例如CSV文件、Excel文件、数据库查询等。 使用Pandas,您可以执行各种数据操作,例如数据清洗、数据转换、数据筛选、数据聚合等。它还提供了强大的数据可视化功能,可以帮助您更好地理解和分析数据。 以下是一个使用Pandas的示例代码: ```python import pandas as pd # 创建一个DataFrame data = {'Name': ['John', 'Emma', 'Mike'], 'Age': [25, 28, 30], 'City': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) # 打印DataFrame print(df) # 对数据进行筛选和操作 filtered_df = df[df['Age'] > 25] sorted_df = df.sort_values('Name') # 打印筛选和排序后的结果 print(filtered_df) print(sorted_df) ``` 这是一个简单的示例,展示了如何创建DataFrame、对数据进行筛选和排序。您可以根据自己的需求使用Pandas进行更复杂的数据操作和分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据人阿多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值