📅  最后修改于: 2023-12-03 15:08:43.980000             🧑  作者: Mango
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()
方法将时间序列转换为纽约时区。