Data used for this tutorial:
  • 本教程使用了来自 \(NO_2\)OpenAQ 和小于2.5微米的颗粒物空气质量数据,这些数据是通过 py-openaq 包下载的。air_quality_no2_long.csv" 数据集分别在巴黎、安特卫普和伦敦提供了测量站 FR04014BETR801London Westminster\(NO_2\) 值。

    To raw data

如何轻松处理时间序列数据#

使用pandas的datetime属性#

  • 我想将``datetime``列中的日期作为datetime对象处理,而不是纯文本

    最初,datetime``中的值是字符字符串,不提供任何datetime操作(例如,提取年份、星期几…)。通过应用``to_datetime``函数,pandas会解释字符串并将其转换为datetime(即 ``datetime64[ns, UTC])对象。在pandas中,我们将这些datetime对象称为类似于标准库中的 datetime.datetimepandas.Timestamp

备注

由于许多数据集确实包含其中一列的datetime信息,pandas的输入函数,如:func:pandas.read_csv 和:func:pandas.read_json ,可以使用 parse_dates 参数(值为要读取为Timestamp的列的列表)在读取数据时执行到日期的转换:

pd.read_csv("../data/air_quality_no2_long.csv", parse_dates=["datetime"])

为什么这些 pandas.Timestamp 对象很有用?让我们用一些示例来说明其附加值。

我们正在处理的时间序列数据集的开始日期和结束日期是什么?

pandas.Timestamp 用于datetime,使我们能够对日期信息进行计算并使其可比较。因此,我们可以使用它来获得时间序列的长度:

结果是 pandas.Timedelta 对象,类似于标准Python库中的 datetime.timedelta,定义了时间长度。

To user guide

pandas支持的各种时间概念在用户指南的 time related concepts 部分进行了说明。

  • 我想向 DataFrame 添加一个包含测量月份的新列

    通过将 Timestamp 对象用于日期,pandas提供了许多与时间相关的属性。例如 month,还有 yearquarter…所有这些属性都可以通过 dt 访问器访问。

To user guide

现有的日期属性的概述在 time and date components overview table 中给出。关于 dt 访问器(用于返回类似datetime的属性)的更多详细信息在 dt accessor 的专门部分进行了解释。

  • 每个测量地点每周的平均 \(NO_2\) 浓度是多少?

    还记得 tutorial on statistics calculationgroupby 提供的split-apply-combine模式吗?在这里,我们想计算**每周**和**每个测量地点**的给定统计量(例如,平均 \(NO_2\) )。为了按星期几分组,我们使用pandas Timestamp 的datetime属性 weekday``(星期一=0,星期日=6),它也可以通过 ``dt 访问器访问。通过对地点和星期几进行分组,可以对这些组合中的每一个进行平均值计算。

    危险

    由于我们在这些示例中处理的时间序列非常短,因此分析结果不具有长期代表性!

  • 绘制我们所有站点时间序列中一天中的典型 \(NO_2\) 模式。换句话说,一天中每个小时的平均值是多少?

    与前面的情况类似,我们想计算**一天中每个小时**的给定统计量(例如,平均 \(NO_2\) ),我们可以再次使用split-apply-combine方法。对于这种情况,我们使用pandas Timestamp 的datetime属性 hour,它也可以通过 dt 访问器访问。

Datetime作为索引#

tutorial on reshaping 中,介绍了 pivot() 来重塑数据表,使每个测量地点成为独立的列:

备注

通过对数据进行透视, datetime 信息成为了表格的索引。通常,将某一列设为索引可以通过 set_index 函数实现。

使用 datetime 索引(即 DatetimeIndex)可以提供强大的功能。例如,我们不需要 dt 访问器来获取时间序列属性,而是可以直接在索引上访问这些属性:

其他一些优点包括方便地选择时间段或在图表中适应时间刻度。让我们将这一点应用到我们的数据上。

  • 绘制从 5 月 20 日到 5 月 21 日末不同站点 \(NO_2\) 值的图表

    通过提供一个 可以解析为 datetime 的字符串,可以基于 DatetimeIndex 选择数据的特定子集。

To user guide

更多关于 DatetimeIndex 和使用字符串进行切片的信息,请参见 time series indexing 部分。

将时间序列重采样到另一个频率#

  • 将当前的小时时间序列值聚合为每个站点的月度最大值。

    一个强大的用于处理具有 datetime 索引的时间序列数据的函数是能够将时间序列 resample() 到另一个频率(例如,将秒级数据转换为 5 分钟级数据)。

resample() 方法类似于 groupby 操作:

  • 它提供了一种基于时间的分组,通过使用一个字符串(例如 M, 5H, …)定义目标频率。

  • 它需要一个聚合函数,如 mean, max, …。

To user guide

用于定义时间序列频率的别名的一览表,请参见 offset aliases overview table

定义后,时间序列的频率由 freq 属性提供:

  • 绘制每个站点每日平均 \(NO_2\) 值的图表。

To user guide

更多关于时间序列 resampling 功能的详细信息,请参见用户指南中关于 resampling 的部分。

REMEMBER

  • 可以使用 to_datetime 函数或在读取函数中将有效的日期字符串转换为 datetime 对象。

  • pandas 的 Datetime 对象支持使用 dt 访问器进行计算、逻辑运算和方便的日期相关属性。

  • DatetimeIndex 包含这些日期相关属性,并支持方便的切片。

  • Resample 是一个强大的方法,用于更改时间序列的频率。

To user guide

时间序列的完整概览,请参见 time series and date functionality 页面。