对于 Pandas 来说,可以处理众多的数据类型,其中最有趣和最重要的数据类型之一就是时间序列数据。时间序列数据无处不在,它在各个行业都有很多应用。患者健康指标、股票价格变化、天气记录、经济指标、服务器、网络、传感器和应用程序性能监控都是时间序列数据的应用方向
我们可以将时间序列数据定义为在不同时间间隔获得并按时间顺序排列的数据点的集合
Pandas 基本上是为分析金融时间序列数据而开发的,并为处理时间、日期和时间序列数据提供了一整套全面的框架
今天我们来讨论在 Pandas 中处理日期和时间的多个方面,具体包含如下内容:
-
Timestamp 和 Period 对象的功能
-
如何使用时间序列 DataFrames
-
如何对时间序列进行切片
-
DateTimeIndex 对象及其方法
-
如何重新采样时间序列数据
探索 Pandas 时间戳和周期对象
Pandas 库提供了一个名为 Timestamp 的具有纳秒精度的 DateTime 对象来处理日期和时间值。Timestamp 对象派生自 NumPy 的 datetime64 数据类型,使其比 Python 的 DateTime 对象更准确而且更快。下面让我们使用 Timestamp 构造函数创建一些 Timestamp 对象。
import pandas as pd
import numpy as np
from IPython.display import display
print(pd.Timestamp(year=1982, month=9, day=4, hour=1, minute=35, second=10))
print(pd.Timestamp('1982-09-04 1:35.18'))
print(pd.Timestamp('Sep 04, 1982 1:35.18'))
Output:
1982-09-04 01:35:10
1982-09-04 01:35:10
1982-09-04 01:35:10
如果将单个整数或浮点值传递给 Timestamp 构造函数,它会返回一个时间戳,该时间戳等于 Unix 纪元(1970 年 1 月 1 日)之后的纳秒数:
print(pd.Timestamp(5000))
Output:
1970-01-01 00:00:00.000005
Timestamp 对象包含许多方法和属性,可帮助我们访问时间戳的不同功能。让我们尝试一下:
time_stamp = pd.Timestamp('2022-02-09')
print('{}, {} {}, {}'.format(time_stamp.day_name(), time_stamp.month_name(), time_stamp.day, time_stamp.year))
Output:
Wednesday, February 9, 2022
Timestamp 类的一个实例代表一个时间点,而 Period 对象的一个实例代表一个时期,例如一年、一个月等
例如,公司在一年的时间里监控他们的收入。Pandas 库提供了一个名为 Period 的对象来处理,如下所示:
year = pd.Period('2021')
display(year)
Output:
Period('2021', 'A-DEC')
我们可以看到它创建了一个代表 2021 年期间的 Period 对象,而“A-DEC”表示该期间是年度的,在 12 月结束
Period 对象提供了许多有用的方法和属性。例如,如果要返回期间的开始和结束时间,可以使用以下属性:
print('Start Time:', year.start_time)
print('End Time:', year.end_time)
Output:
Start Time: 2021-01-01 00:00:00
End Time: 2021-12-31 23:59:59.999999999
要创建每月期间,可以将特定月份传递给它,如下所示
month = pd.Period('2022-01')
display(month)
print('Start Time:', month.start_time)
print('End Time:', month.end_time)
Output:
Period('2022-01', 'M')
Start Time: 2022-01-01 00:00:00
End Time: 2022-01-31 23:59:59.999999999
“M”表示周期的频率是每月一次。还可以使用 freq 参数显式指定周期的频率。下面的代码创建了一个代表 2022 年 1 月 1 日期间的期间对象:
day = pd.Period('2022-01', freq='D')
display(day)
print('Start Time:', day.start_time)
print('End Time:', day.end_time)
Output:
Period('2022-01-01', 'D')
Start Time: 2022-01-01 00:00:00
End Time: 2022-01-01 23:59:59.999999999
我们还可以对周期对象执行算术运算。让我们创建一个每小时频率的新 period 对象,看看我们如何进行计算:
hour = pd.Period('2022-02-09 16:00:00', freq='H')
display(hour)
display(hour + 2)
display(hour - 2)
Output:
Period('2022-02-09 16:00', 'H')
Period('2022-02-09 18:00', 'H')
Period('2022-02-09 14:00', 'H')
我们可以使用 Pandas 日期偏移量获得相同的结果:
display(hour + pd.offsets.Hour(+2))
display(hour +