首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【无痛学Python】时间序列数据分析,看这一篇就够了!

【无痛学Python】时间序列数据分析,看这一篇就够了!

作者头像
Skrrapper
发布2025-06-11 11:00:31
发布2025-06-11 11:00:31
6380
举报
文章被收录于专栏:技术分享技术分享

【Python数据分析】时间序列数据分析,看这一篇就够了!

时间序列就是按照时间顺序排列的一组数据序列,在生活中很多领域,在各个方面,时间序列都是很重要的结构化数据类型。毕竟时间对于人类来说,是很重要的东西。

时间序列数据分析技术就是发现这组数据的变化规律并用于预测的统计技术。

日期和时间数据类型

1.datetime构造

Python标准库中已经包含了用于日期(date)、时间(time)、日历数据的数据类型,主要用于datetime(日期和时间)、time(指的是具体的时、分、秒)、calendar(日历)模块。

类型

说明

date

日期(年月日)

time

时间(时分秒)

datetime

日期和时间(包含上面两个)

timedelta

两个datetime的差值

tzinfo

用于存储时区信息的基本类型

代码语言:javascript
复制
import datetime
date = datetime.date(2025,5,13)
print(date.year)
print(date.month)
print(date.day)

time = datetime.time(16,42,50)
print(time)

now = datetime.datetime.now()
print(now)

date1 = date + datetime.timedelta(120) # 加天数
print(date1)

birth = datetime.datetime(2005,2,7)
delta = now - birth # 注意这里只能是差值,不能相加
print(delta)

2.数据转换

在数据分析中,字符串和datetime类数据需要进行转换,通过str方法可以直接将datetime类数据转换为字符串数据。

代码语言:javascript
复制
stamp = datetime.datetime(2005,5,3)
print(str(stamp))

如果需要将datetime类数据转换为特定格式的字符串数据,需要使用strftime方法。

daretime格式说明如下表:

代码语言:javascript
复制
# 转换成 四位年份/两位月份/两位日期
stamp = datetime.datetime(2005,5,3)
print(stamp.strftime('%Y/%m/%d')) #2005/05/03

时间序列基础

Pandas中的基础时间序列种类是由时间戳索引的Series,在Pandas外部则表示为Python字符串或datetime对象。

1.时间序列构造

基于Pandas,我们时间序列的构造就是以时间数据为索引的Series或者DataFrame,构造方法即为Series。

代码语言:javascript
复制
pdates = [datetime.datetime(2025,5,13),datetime.datetime(2025,5,18),datetime.datetime(2025,5,20)]
s = pd.Series(np.arange(3),index = pdates)
print(s)
代码语言:javascript
复制
2025-05-13    0
2025-05-18    1
2025-05-20    2
dtype: int64

与其他Series类似,不同索引的时间序列之间的算术运算在日期上会自动对齐。

2.索引与切片

和Pandas中使用索引的方法一样。

代码语言:javascript
复制
print(s[:2])
代码语言:javascript
复制
2025-05-13    0
2025-05-18    1
dtype: int64

也可以使用索引获取时间序列的切片

代码语言:javascript
复制
print(s['2025-5-13':'2025-5-18'])
代码语言:javascript
复制
2025-05-13    0
2025-05-18    1
dtype: int64

或者是使用其中的年、月、日分别来获取切片

代码语言:javascript
复制
# 使用年获取切片
print(s['2025')
# 使用月获取切片
print(s['2025-5'])
# 使用月和日获取切片
print(s['2025-05-18':'2025-05-20'])
代码语言:javascript
复制
2025-05-13    0
2025-05-18    1
2025-05-20    2
dtype: int64
2025-05-13    0
2025-05-18    1
2025-05-20    2
dtype: int64
2025-05-18    1
2025-05-20    2
dtype: int64

日期范围、频率和移位

Pandas的通用时间序列是不规则的,也就是说时间序列的频率是不固定的。

但是我们经常会需要处理固定频率的场景,如每天每月等等,所以,Pandas也提供一套标准的时间序列频率和工具用于重新采样、推断频率及生成固定频率的数据范围。

1.日期范围

使用pd.date_range创建指定长度的DatetimeIndex索引。

代码语言:javascript
复制
index = pd.date_range('2020-12-25','2021-1-8')
print(index)
代码语言:javascript
复制
DatetimeIndex(['2020-12-25', '2020-12-26', '2020-12-27', '2020-12-28',
               '2020-12-29', '2020-12-30', '2020-12-31', '2021-01-01',
               '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05',
               '2021-01-06', '2021-01-07', '2021-01-08'],
              dtype='datetime64[ns]', freq='D')

如果不指定开始日期或者结束日期的其中之一,那么就需要指定一个长度,我们使用periods来进行传递。

代码语言:javascript
复制
# 从start开始前进
index = pd.date_range(start = '2020-12-25',period = 10)
print(index)
# 从end开始倒退
index = pd.date_range(end = '2020-12-25',period = 10)
print(index)
代码语言:javascript
复制
DatetimeIndex(['2020-12-25', '2020-12-26', '2020-12-27', '2020-12-28',
               '2020-12-29', '2020-12-30', '2020-12-31', '2021-01-01',
               '2021-01-02', '2021-01-03'],
              dtype='datetime64[ns]', freq='D')

DatetimeIndex(['2020-12-16', '2020-12-17', '2020-12-18', '2020-12-19',
               '2020-12-20', '2020-12-21', '2020-12-22', '2020-12-23',
               '2020-12-24', '2020-12-25'],
              dtype='datetime64[ns]', freq='D')

2.频率和移位

1.频率

时间序列的频率由基础频率和日期偏置(指的是缩写的全称)组成,可以通过freq参数使用其他频率,基础时间序列频率见表:

类型

偏置类型

描述

D

Day

日历日的每天

B

BusinessDay

工作日的每天

H

Hour

每小时

T或min

Minute

每分钟

S

Second

每秒

M

MonthEnd

每个月最后一个工作日

BM

BusinessMonthEnd

工作日的月底日期

MS

MonthBegin

工作日的月初日期

A-JAN

BusinessYearEnd

每年指定月份的最后一个日历日

在类型前面可以添加整数,例如“2H”,指的是“每两个小时”

2.移位

移位指的是将日期按时间向前或向后移动。Series和DataFrame都有一个shift方法用于简单地前向或后向移位,而不改变索引。

代码语言:javascript
复制
wdate = pd.Series(np.random.randn(4),index = pd.date_range('2019/1/1',periods=4,freq='W'))
print(wdate)
print(wdate.shift(2))
代码语言:javascript
复制
2019-01-06    0.713528
2019-01-13   -0.935406
2019-01-20    0.565824
2019-01-27    0.685361
Freq: W-SUN, dtype: float64
2019-01-06         NaN
2019-01-13         NaN
2019-01-20    0.713528
2019-01-27   -0.935406

这样就仅仅是直接删除了数据,不会修改索引。如果我们传入频率参数,就可以修改索引。

代码语言:javascript
复制
wdate = pd.Series(np.random.randn(4),index = pd.date_range('2019/1/1',periods=4,freq='W'))
print(wdate)
print(wdate.shift(2,freq = 'D'))
代码语言:javascript
复制
2019-01-08    0.627763
2019-01-15    1.510974
2019-01-22    2.215427
2019-01-29    0.696788
dtype: float64

时期

时期表示的是时间区间,如数天,数月或数年等。

1.时期基础

Period可以创建时期型的数据,传入字符串、整数或频率都可以。

代码语言:javascript
复制
w = pd.Period(2019,freq = 'A-DEC')
print(w)
print(w + 2)

可以通过Pandas中的例如date_range等方法创建日期范围。

代码语言:javascript
复制
wdate = pd.period_range('2019/1/1','2019/6/1',freq = 'M')
print(pd.Series(np.arange(6),index=wdate))

2.频率转换

Period和PeriodIndex对象可以通过asfreq方法转换频率。

代码语言:javascript
复制
wdate = pd.period_range('2019/1/1','2019/6/1',freq = 'M')
print(wdate.asfreq('Y',how = 'start'))

3.时期数据转换

使用to_period可以将以时间戳作为索引的时间序列数据转换为以时期为索引的时间序列。

代码语言:javascript
复制
w = pd.date_range('2019/1/1','2019/6/1',freq = 'M')
y = pd.Serios(np.arange(5),index = w)
  • 原始数据:w 是一个 DatetimeIndex,表示从 2019 年 1 月到 2019 年 6 月的每月时间点。
  • 转换操作:通过 to_period() 方法,将 DatetimeIndex 转换为 PeriodIndex,从而将时间点表示为时间段(例如,2019-01 表示整个 2019 年 1 月)。

重采样、降采样和升采样

重采样是时间序列频率转换的过程。

高频率聚合到低频率称为降采样;低频率转换到高频率称为升采样。

重采样

Pandas中的resample函数用于各种频率的转换工作。

参数

描述

freq

转换频率

axies=0

重采样的轴

closed = ‘right’

设置各时间段那端是闭合的

label = ‘right’

如何设置聚合值的标签

loffset = None

设置时间偏移

kind = None

聚合到时期,默认为时间序列的索引类型

convention

升采样采用的约定,默认为end

降采样

主要考虑closed和label参数。分别表示哪边区间是闭合,哪边是标记的。

升采样

主要是数据的插值,即对缺失值进行填充,填充方法于fillna类似。

时间序列的平稳性检验

在做时间序列分析时,要经常对时间序列做平稳性实验。

分别有以下三种:时序图检验、自相关图检验、构造统计量检验

1. 时序图检验

通过绘制时间序列的折线图,观察数据的趋势和波动性。如果时间序列存在明显的趋势(如上升或下降)或周期性波动,则说明序列可能是非平稳的。

  • 特点:
    • 直观简单。
    • 适合初步判断时间序列的平稳性。
  • 实现方法: 使用 matplotlib 绘制时间序列图。
代码语言:javascript
复制
import matplotlib.pyplot as plt

# 示例代码
plt.plot(time_series)
plt.title("时序图")
plt.xlabel("时间")
plt.ylabel("值")
plt.show()

2. 自相关图检验

通过绘制自相关函数(ACF)图,观察时间序列的自相关性。如果序列的自相关系数随滞后时间迅速衰减到零,则序列可能是平稳的;如果自相关系数缓慢衰减或呈现周期性,则可能是非平稳的。

  • 特点:
    • 通过统计学方法分析序列的相关性。
    • 适合发现序列的周期性或趋势性。
  • 实现方法: 使用 statsmodelsplot_acf 函数绘制自相关图。
代码语言:javascript
复制
from statsmodels.graphics.tsaplots import plot_acf

# 示例代码
plot_acf(time_series, lags=30)
plt.title("自相关图")
plt.show()

3. 构造统计量检验

通过统计检验方法(如ADF检验、KPSS检验)判断时间序列的平稳性。ADF(Augmented Dickey-Fuller)检验是最常用的方法,其原假设是序列非平稳。如果检验的 p 值小于显著性水平(如 0.05),则可以拒绝原假设,认为序列是平稳的。

  • 特点:
    • 定量分析,结果更具说服力。
    • 适合精确判断序列的平稳性。
  • 实现方法: 使用 statsmodelsadfuller 函数进行 ADF 检验。
代码语言:javascript
复制
from statsmodels.tsa.stattools import adfuller

# 示例代码
result = adfuller(time_series)
print("ADF 检验统计量:", result[0])
print("p 值:", result[1])
print("临界值:", result[4])
if result[1] < 0.05:
    print("序列是平稳的")
else:
    print("序列是非平稳的")

总结

  • 时序图检验: 直观判断趋势和波动性。
  • 自相关图检验: 分析序列的自相关性。
  • 构造统计量检验: 定量判断平稳性,结果更精确。 elsadfuller` 函数进行 ADF 检验。
代码语言:javascript
复制
from statsmodels.tsa.stattools import adfuller

# 示例代码
result = adfuller(time_series)
print("ADF 检验统计量:", result[0])
print("p 值:", result[1])
print("临界值:", result[4])
if result[1] < 0.05:
    print("序列是平稳的")
else:
    print("序列是非平稳的")

总结

  • 时序图检验: 直观判断趋势和波动性。
  • 自相关图检验: 分析序列的自相关性。
  • 构造统计量检验: 定量判断平稳性,结果更精确。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 日期和时间数据类型
    • 1.datetime构造
    • 2.数据转换
  • 时间序列基础
    • 1.时间序列构造
    • 2.索引与切片
  • 日期范围、频率和移位
    • 1.日期范围
    • 2.频率和移位
      • 1.频率
      • 2.移位
  • 时期
    • 1.时期基础
    • 2.频率转换
    • 3.时期数据转换
  • 重采样、降采样和升采样
    • 重采样
    • 降采样
    • 升采样
  • 时间序列的平稳性检验
    • 1. 时序图检验
    • 2. 自相关图检验
    • 3. 构造统计量检验
    • 总结
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档