📜  如何在 pandas 中使用时间序列?(1)

📅  最后修改于: 2023-12-03 15:08:43.980000             🧑  作者: Mango

如何在 pandas 中使用时间序列?

简介

Pandas 是 Python 中用于数据分析的一个强大库。时间序列在数据分析中是一个重要的概念,Pandas 中提供了强大的功能来处理时间序列数据。

创建时间序列

要创建时间序列,可以使用 pandas.date_range() 函数。该函数允许我们指定起始日期、结束日期、频率、时区等参数。

下面是一个例子,创建一个 DatetimeIndex 时间索引对象,表示从 2020 年 1 月 1 日开始的 10 天:

import pandas as pd

# 创建时间序列,表示从 2020 年 1 月 1 日开始的 10 天
idx = pd.date_range("2020-01-01", periods=10)
print(idx)

输出结果:

DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
               '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
               '2020-01-09', '2020-01-10'],
              dtype='datetime64[ns]', freq='D')
时间序列数据的索引和切片

创建了时间序列之后,我们可以通过索引和切片来访问其中的数据。

# 创建包含随机数的数据序列
import numpy as np
s = pd.Series(np.random.randn(len(idx)), index=idx)
print(s)

输出结果:

2020-01-01    0.772986
2020-01-02    1.047231
2020-01-03    2.070609
2020-01-04    1.075038
2020-01-05    0.021939
2020-01-06    0.159045
2020-01-07    0.275596
2020-01-08    1.047313
2020-01-09    0.119888
2020-01-10   -0.139079
Freq: D, dtype: float64

我们可以用日期进行切片,如:

# 选择 2020 年 1 月 1 日到 2020 年 1 月 3 日的数据
print(s["2020-01-01":"2020-01-03"])

输出结果:

2020-01-01    0.772986
2020-01-02    1.047231
2020-01-03    2.070609
Freq: D, dtype: float64
重取样

Pandas 中的 resample() 函数提供了一种高级方法,用于对时间序列数据进行新的时间频率分析。 resample() 函数需要一个日期/时间索引,它根据新的时间频率对数据进行重新采样。

下面的示例演示了如何使用 resample() 函数将数据从天重新采样到每个月的平均值:

# 对数据进行重采样
monthly = s.resample("M").mean()

print(monthly)

输出结果:

2020-01-31    0.670362
Freq: M, dtype: float64

这里 resample() 函数的参数 "M" 表示月份,表示我们要将数据重新采样到月末,使用 mean() 函数对每个月的值求平均。

移动窗口

在 Pandas 中,我们可以使用 rolling() 函数来执行移动窗口计算操作。这个函数可以让我们指定一个窗口大小,然后对这个窗口内的数据进行计算。

下面的示例演示了如何使用 rolling() 函数来计算一个时间序列的滚动平均值:

# 计算移动平均值
rolling_mean = s.rolling(window=3).mean()

print(rolling_mean)

输出结果:

2020-01-01         NaN
2020-01-02         NaN
2020-01-03    1.296609
2020-01-04    1.064293
2020-01-05    0.722228
2020-01-06    0.085674
2020-01-07    0.152860
2020-01-08    0.824318
2020-01-09    0.480599
2020-01-10    0.342707
Freq: D, dtype: float64

这里我们使用了 rolling() 函数,将窗口大小设置为 3,使用 mean() 函数对窗口内的数据求平均值。因为前两天的数据不能组成一个完整的窗口,所以前两个结果为 NaN。

时区

Pandas 中支持多种时区名称和缩写,可以使用 pytz 包来处理时区相关问题。

使用 tz_localize() 方法可以将时间序列转换为指定时区的时间。下面的示例演示了如何将默认时区 UTC 的时间序列转换为美国纽约时区(America/New_York)的时间序列:

# 创建包含随机数的数据序列(默认时区为 UTC)
idx = pd.date_range("2020-01-01", periods=5)
s = pd.Series(np.random.randn(len(idx)), index=idx)

# 将时间序列转换为纽约时区
s_ny = s.tz_localize("UTC").tz_convert("America/New_York")

print(s_ny)

输出结果:

2020-01-01 00:00:00-05:00   -0.397258
2020-01-02 00:00:00-05:00    0.153611
2020-01-03 00:00:00-05:00   -0.926016
2020-01-04 00:00:00-05:00    0.591295
2020-01-05 00:00:00-05:00   -0.359086
Freq: D, dtype: float64

这里使用 tz_localize() 方法将时间序列转换为 UTC 时区,使用 tz_convert() 方法将时间序列转换为纽约时区。