-
Air quality data
本教程使用了来自 \(NO_2\) 的 OpenAQ 和小于2.5微米的颗粒物空气质量数据,这些数据是通过 py-openaq 包下载的。
To raw dataair_quality_no2_long.csv"数据集分别在巴黎、安特卫普和伦敦提供了测量站 FR04014、BETR801 和 London Westminster 的 \(NO_2\) 值。
如何轻松处理时间序列数据#
使用pandas的datetime属性#
我想将``datetime``列中的日期作为datetime对象处理,而不是纯文本
最初,
datetime``中的值是字符字符串,不提供任何datetime操作(例如,提取年份、星期几…)。通过应用``to_datetime``函数,pandas会解释字符串并将其转换为datetime(即 ``datetime64[ns, UTC])对象。在pandas中,我们将这些datetime对象称为类似于标准库中的datetime.datetime的pandas.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,定义了时间长度。
pandas支持的各种时间概念在用户指南的 time related concepts 部分进行了说明。
我想向
DataFrame添加一个包含测量月份的新列通过将
Timestamp对象用于日期,pandas提供了许多与时间相关的属性。例如month,还有year、quarter…所有这些属性都可以通过dt访问器访问。
现有的日期属性的概述在 time and date components overview table 中给出。关于 dt 访问器(用于返回类似datetime的属性)的更多详细信息在 dt accessor 的专门部分进行了解释。
每个测量地点每周的平均 \(NO_2\) 浓度是多少?
还记得 tutorial on statistics calculation 中
groupby提供的split-apply-combine模式吗?在这里,我们想计算**每周**和**每个测量地点**的给定统计量(例如,平均 \(NO_2\) )。为了按星期几分组,我们使用pandasTimestamp的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选择数据的特定子集。
更多关于 DatetimeIndex 和使用字符串进行切片的信息,请参见 time series indexing 部分。
将时间序列重采样到另一个频率#
将当前的小时时间序列值聚合为每个站点的月度最大值。
一个强大的用于处理具有 datetime 索引的时间序列数据的函数是能够将时间序列
resample()到另一个频率(例如,将秒级数据转换为 5 分钟级数据)。
resample() 方法类似于 groupby 操作:
它提供了一种基于时间的分组,通过使用一个字符串(例如
M,5H, …)定义目标频率。它需要一个聚合函数,如
mean,max, …。
用于定义时间序列频率的别名的一览表,请参见 offset aliases overview table 。
定义后,时间序列的频率由 freq 属性提供:
绘制每个站点每日平均 \(NO_2\) 值的图表。
更多关于时间序列 resampling 功能的详细信息,请参见用户指南中关于 resampling 的部分。
REMEMBER
可以使用
to_datetime函数或在读取函数中将有效的日期字符串转换为 datetime 对象。pandas 的 Datetime 对象支持使用
dt访问器进行计算、逻辑运算和方便的日期相关属性。DatetimeIndex包含这些日期相关属性,并支持方便的切片。Resample是一个强大的方法,用于更改时间序列的频率。
时间序列的完整概览,请参见 time series and date functionality 页面。