前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【无痛学Python】时间序列数据分析,看这一篇就够了!

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

作者头像
Skrrapper
发布于 2025-06-11 03:00:31
发布于 2025-06-11 03:00:31
18400
代码可运行
举报
文章被收录于专栏:技术分享技术分享
运行总次数:0
代码可运行

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

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

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

日期和时间数据类型

1.datetime构造

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

类型

说明

date

日期(年月日)

time

时间(时分秒)

datetime

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

timedelta

两个datetime的差值

tzinfo

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
stamp = datetime.datetime(2005,5,3)
print(str(stamp))

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

daretime格式说明如下表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 转换成 四位年份/两位月份/两位日期
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
2025-05-13    0
2025-05-18    1
2025-05-20    2
dtype: int64

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

2.索引与切片

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(s[:2])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2025-05-13    0
2025-05-18    1
dtype: int64

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(s['2025-5-13':'2025-5-18'])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2025-05-13    0
2025-05-18    1
dtype: int64

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用年获取切片
print(s['2025')
# 使用月获取切片
print(s['2025-5'])
# 使用月和日获取切片
print(s['2025-05-18':'2025-05-20'])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
index = pd.date_range('2020-12-25','2021-1-8')
print(index)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
# 从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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
w = pd.Period(2019,freq = 'A-DEC')
print(w)
print(w + 2)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
wdate = pd.period_range('2019/1/1','2019/6/1',freq = 'M')
print(wdate.asfreq('Y',how = 'start'))

3.时期数据转换

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt

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

2. 自相关图检验

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

  • 特点:
    • 通过统计学方法分析序列的相关性。
    • 适合发现序列的周期性或趋势性。
  • 实现方法: 使用 statsmodelsplot_acf 函数绘制自相关图。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
【愚公系列】2023年11月 大数据教学课程 009-JVM线程执行分析
后进行线程执行分析可以帮助我们了解程序在运行时的具体调用过程和资源占用情况,进而发现并排除程序中的性能瓶颈和线程安全问题。通过线程执行分析可以获得以下好处:
愚公搬代码
2025/06/02
1050
【愚公系列】2023年11月 大数据教学课程 009-JVM线程执行分析
性能优化-jstack的使用
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等,我们该如何分析呢?
cwl_java
2020/02/13
2.2K0
JDK 定时任务 Timer 与 ScheduledExecutorService 排坑记录
正在认真敲代码的楼主,突然收到数据维护系统发过来的报警邮件说楼主凌晨跑的定时任务没有成功,于是便开始了楼主今天的找坑填坑的过程。
haifeiWu
2018/09/11
1.3K0
JDK 定时任务 Timer 与 ScheduledExecutorService 排坑记录
JVM调优常用命令及工具
每500ms统计一次gc情况,共执行200次。jstat -gc 262968 500 200
全栈程序员站长
2022/08/28
1.2K0
JVM调优常用命令及工具
GC之jstack 原
    用jstack命令jstack -l 18261>./18261jstack.txt拉取线程信息,18261是进程ID,文件18261jstack.txt的内容如下:
克虏伯
2019/04/15
9130
jstack 命令使用经验总结和线程性能诊断脚本
编辑:业余草 来源:https://www.xttblog.com/?p=4946 分享一下,jstack 命令使用经验总结 jstack 在命令使用上十分简洁, 然而其输出的内容却十分丰富, 信息
业余草
2020/04/08
2.4K0
Jvm线程堆分析
同样,也有一些工具可以很方便的对线程的stack信息进行可视化的分析: fastthread就是一个在线分析线程stack的工具 fastthread使用界面:
冬天里的懒猫
2021/08/12
6920
Jvm线程堆分析
JVM Dump分析
Thread Dump是非常有用的诊断 Java应用问题的工具。每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚拟机打印的 thread dump略有不同,但是大多都提供了当前活动线程的快照,及 JVM中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。
Java架构师必看
2021/05/14
2K0
JVM Dump分析
聊聊jvm的Stack Memory
序 本文主要研究一下jvm的Stack Memory Java-Heap-Stack-Memory.png Virtual Machine Stack 每个jvm线程都有一个私有的Virtual Machine Stack,它在线程同时被创建 该stack主要用于存储frames,即所谓的stack frames 每个方法在执行的时候都会创建一个stack frame,用于存储方法的局部变量、返回值、Operand stack等 Stack Memory Stack Memory是执行线程时所使用的内存
code4it
2019/04/01
1.6K0
聊聊jvm的Stack Memory
源码分析:Java中的Thread的创建和运行
在面试候选人的时候,我有时候会提出这样的一个问题:说说你对Java线程的理解?从这个问题开始,可以考察候选人对并发基础的掌握、对操作系统基本概念的理解,如果遇到对底层有浓厚兴趣的同学,我会抛出另一个问题:Java里的线程和操作系统的线程是什么关系?它们是如何对应的?这两个问题,就是今天这篇文章想讲述的。
阿杜
2018/12/27
1.3K0
聊聊kafka consumer offset lag increase异常
本文主要解析一下遇到的一个kafka consumer offset lag不断增大的异常。
code4it
2018/09/17
1.4K0
JVM故障分析及性能优化实战(IV)——jstack生成的Thread Dump日志线程状态
前面文章中只分析了Thread Dump日志文件的结构,今天针对日志文件中 Java EE middleware, third party & custom application Threads 部分线程的状态进行详细的分析。
IT技术小咖
2019/09/29
2.2K0
JVM故障分析及性能优化实战(IV)——jstack生成的Thread Dump日志线程状态
jvm调优
查看java程序运行的环境参数,包括Java System属性和JVM命令行参数.。
IT云清
2019/06/14
1K0
jvm调优
详解 Java 线上问题排查思路
因为通常线程数量会由线程池管理,一般不会超过我们设定的最大值;而线程“死锁”通常是人为代码问题,某个获得锁的线程没有释放锁,导致其他线程一直处于 Waiting 状态(或者 CAS 自旋状态)。
宫水三叶的刷题日记
2021/03/02
3.5K0
详解 Java 线上问题排查思路
线上服务启动卡死,堆栈分析
这一步,就是等待队列为非空的时候,才会执行下去,但是现在队列一直为空,线程都在等待。
MickyInvQ
2020/09/27
2.4K0
线上服务启动卡死,堆栈分析
记阿里Druid数据连接池引发的线上血案
事件起因:项目使用了activiti工作流,系统是由老的spring mvc项目改造成的spring boot项目,数据库链接池从dbcp切换到druid,新系统上线后,同事多次系统隔一段时间后数据查询就很慢,基本出不来。由此开始了线上bug排查之路。这个问题从一开始就模糊定位到数据库层面的问题,因为只有和数据相关的操作会很慢,其他服务不受影响,并且在中午休息时没有问题,在下午刚上班后不就出现。
kl博主
2018/04/13
20.9K0
记阿里Druid数据连接池引发的线上血案
jvm 性能调优、监控工具 -- jps、jstack、jmap、jhat、jstat、hprof
上一篇文章中,我们介绍了哪些场景会引起 java 的内存泄露。 然而,很多情况下,内存泄露、内存不足、CPU占用过高等问题都很容易被重启服务器、增加内存等处理方式隐藏,大多 java 程序员也并不会去深究问题的根源。 本文,我们就来学习 java 提供的性能监控、调优工具,来定位、解决这些容易被隐藏的问题。
用户3147702
2022/06/27
1.7K0
jvm 性能调优、监控工具 -- jps、jstack、jmap、jhat、jstat、hprof
JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一种工具都有其自身的特点,用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测。接下来的两个专题分别会讲VisualVM的具体应用。
java干货
2021/02/19
6990
JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)
[翻译]如何分析Java线程dumps
这是关于故障诊断文章的第二篇,翻译自《How to Analyze Java Thread Dumps》,原文地址:https://dzone.com/articles/how-analyze-java-thread-dumps
LNAmp
2018/09/05
1.1K0
Java自带的性能监测工具之jstack
本文继续介绍Java自带的性能监测工具,本文使用jstack (Java Stack Trace)工具来玩~
孟君
2023/02/23
2.8K0
Java自带的性能监测工具之jstack
相关推荐
【愚公系列】2023年11月 大数据教学课程 009-JVM线程执行分析
更多 >
LV.1
后端工程师
目录
  • 日期和时间数据类型
    • 1.datetime构造
    • 2.数据转换
  • 时间序列基础
    • 1.时间序列构造
    • 2.索引与切片
  • 日期范围、频率和移位
    • 1.日期范围
    • 2.频率和移位
      • 1.频率
      • 2.移位
  • 时期
    • 1.时期基础
    • 2.频率转换
    • 3.时期数据转换
  • 重采样、降采样和升采样
    • 重采样
    • 降采样
    • 升采样
  • 时间序列的平稳性检验
    • 1. 时序图检验
    • 2. 自相关图检验
    • 3. 构造统计量检验
    • 总结
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档