一周学会Pandas2之Python数据处理与分析-Pandas2时间序列数据分析

article/2025/6/29 2:19:24

锋哥原创的Pandas2 Python数据处理与分析 视频教程:  

2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili

Pandas 提供了强大的时间序列处理功能,是金融分析、物联网数据处理、业务指标监控等领域的核心工具。下面我将全面介绍时间序列数据处理的核心知识点和方法:

一、时间序列基础

1. 时间数据类型

Pandas 提供了4种核心时间数据类型:

  • Timestamp:表示单个时间点(纳秒精度)

  • DatetimeIndex:时间戳索引

  • Period:表示时间区间

  • PeriodIndex:时间段索引

pandas.Timestamp() 用于创建单个时间戳对象,可表示特定的日期和时间点。它支持多种输入格式,包括字符串、整数(时间戳)、datetime 对象等。

方法定义:

pandas.Timestamp(ts_input,          # 时间输入(字符串、整数、datetime等)freq=None,         # 频率(如'D'表示天,'H'表示小时)tz=None,           # 时区(如'Asia/Shanghai')unit=None,         # 时间单位(当ts_input为整数时有效)year=None,         # 年(单独指定时使用)month=None,        # 月(1-12)day=None,          # 日(1-31)hour=None,         # 时(0-23)minute=None,       # 分(0-59)second=None,       # 秒(0-59)microsecond=None,  # 微秒(0-999999)nanosecond=None    # 纳秒(0-999999999)
)

pandas.DatetimeIndex 是 Pandas 中用于处理时间序列索引的核心类,它继承自 pandas.Index,专门用于存储和操作时间戳数据。DatetimeIndex 支持高效的时间切片、频率推断、重采样等操作,是时间序列分析的基础工具。

方法定义:

pandas.DatetimeIndex(data=None,            # 时间戳数据(列表、数组或可迭代对象)freq=None,            # 时间频率(如'D'表示天,'H'表示小时)start=None,           # 开始时间(与end/periods配合使用)end=None,             # 结束时间(与start/periods配合使用)periods=None,         # 时间点数量(与start/end配合使用)tz=None,              # 时区(如'Asia/Shanghai')normalize=False,      # 是否将时间规范化为午夜(00:00:00)closed=None,          # 区间开闭性('left'、'right'或None)ambiguous='raise',    # 处理时区歧义的方式dayfirst=False,       # 是否将字符串解析为DD/MM格式yearfirst=False,      # 是否将字符串解析为YYYY/MM格式dtype=None,           # 数据类型(默认为datetime64[ns])copy=False,           # 是否复制数据name=None             # 索引名称
)

pandas.Period 是 Pandas 中用于表示固定时间区间(如 “2025 年 5 月”、“2025Q2”、“2025-05-31 一天”)的类,与 Timestamp(表示时间点)不同,Period 表示的是一个时间段。它支持时间区间的算术运算、频率转换和周期比较,是处理周期性数据的重要工具。

方法定义:

pandas.Period(value=None,       # 时间值(字符串、整数或datetime对象)freq=None,        # 频率(如'A'=年,'Q'=季度,'M'=月,'D'=日等)year=None,        # 年(单独指定时使用)month=None,       # 月(1-12,仅对某些频率有效)quarter=None,     # 季度(1-4,仅对季度频率有效)day=None,         # 日(1-31,仅对某些频率有效)hour=None,        # 时(0-23,仅对某些频率有效)minute=None,      # 分(0-59,仅对某些频率有效)second=None       # 秒(0-59,仅对某些频率有效)
)

pandas.PeriodIndex 是 Pandas 中用于处理固定时间区间序列的索引类,它继承自 pandas.Index,专门用于存储和操作由 Period 对象组成的索引。PeriodIndex 支持高效的周期计算、频率转换和时间区间选择,是处理周期性数据(如月度销售额、季度 GDP 等)的核心工具。

方法定义:

pandas.PeriodIndex(data=None,            # 周期数据(列表、数组或可迭代对象)freq=None,            # 时间频率(如'A'=年,'Q'=季度,'M'=月等)start=None,           # 开始周期(与end/periods配合使用)end=None,             # 结束周期(与start/periods配合使用)periods=None,         # 周期数量(与start/end配合使用)name=None,            # 索引名称copy=False,           # 是否复制数据dtype=None            # 数据类型(默认为period[freq])
)

我们看下示例:

import pandas as pd
import numpy as np# 创建Timestamp
ts = pd.Timestamp('2023-06-15 14:30:00')
print(f"Timestamp: {ts}")# 创建DatetimeIndex
date_range = pd.date_range('2023-01-01', periods=5, freq='D')
print(f"\nDatetimeIndex:\n{date_range}")# 创建Period
p = pd.Period('2023-06')
print(f"\nPeriod: {p}")# 创建PeriodIndex
period_range = pd.period_range('2023-01', periods=3, freq='M')
print(f"\nPeriodIndex:\n{period_range}")

时间序列创建:

# 从字符串创建时间序列
dates = ['2023-01-01', '2023-01-02', '2023-01-03']
ts_list = pd.to_datetime(dates)
print(f"\n从字符串创建:\n{ts_list}")
​
# 创建带时间索引的DataFrame
np.random.seed(42)
df = pd.DataFrame({'temperature': np.random.randint(15, 30, 5),'humidity': np.random.uniform(40, 80, 5)
}, index=pd.date_range('2023-01-01', periods=5, freq='D'))
print(f"\n时间序列DataFrame:\n{df}")

二、时间序列索引与切片

2.1 基本索引方法

# 按日期字符串索引
print("\n按日期索引:")
print(df.loc['2023-01-03'])# 按日期范围索引
print("\n日期范围索引:")
print(df['2023-01-03':'2023-01-05'])

2.2 部分字符串索引

# 创建小时级数据
hourly_data = pd.DataFrame({'value': np.random.rand(24)},index=pd.date_range('2023-01-01', periods=24, freq='h')
)# 按时间段索引
print("\n9:00到12:00的数据:")
print(hourly_data.between_time('09:00', '12:00'))# 按特定时间点索引
print("\n15:30的数据:")
print(hourly_data.at_time('15:30'))

三、时间序列重采样(Resampling)

重采样(Resampling)是时间序列分析中的核心操作,它指的是将时间序列从一个频率转换到另一个频率的过程。Pandas 提供了强大的 resample() 方法来实现这一功能,特别适用于处理时间序列数据的聚合、转换和分析。

重采样的基本概念

  1. 重采样的两种类型 降采样 (Downsampling):从高频数据到低频数据(如日数据 → 月数据) 升采样 (Upsampling):从低频数据到高频数据(如月数据 → 日数据)

  2. 重采样的核心步骤 分组 (Grouping):将时间序列数据分成多个时间区间 聚合 (Aggregation):对每个时间区间内的数据进行聚合计算 填充 (Filling):对于升采样,可能需要填充缺失值

基本语法:

# 基本重采样语法
resampled = df.resample(rule, closed=None, label=None, convention='start', kind=None, on=None, level=None)

参数详解:

  • rule:重采样频率字符串(如 'D'、'M'、'5min')

  • closed:控制区间闭合方向('right' 或 'left')

  • label:设置聚合结果的标签('right' 或 'left')

  • convention:重采样约定('start' 或 'end')

  • kind:指定索引类型('timestamp' 或 'period')

  • on:指定时间列(如果索引不是时间类型)

  • level:用于多级索引的时间级别

我们看一个降采样(Downsampling)示例:

import pandas as pd
import numpy as np
​
# 创建日数据
dates = pd.date_range('2023-01-01', periods=90, freq='D')
daily_data = pd.DataFrame({'sales': np.random.randint(100, 500, 90),'visitors': np.random.randint(50, 200, 90)
}, index=dates)
​
# 按月重采样(求和)
monthly_sales = daily_data.resample('ME').sum()
print("\n按月重采样(求和):")
print(monthly_sales)
​
# 按周重采样(平均值)
weekly_avg = daily_data.resample('W-MON').mean()
print("\n按周重采样(平均值):")
print(weekly_avg.head())

我们在看一个升采样(Upsampling)的示例:

import pandas as pd# 创建月数据
monthly_data = pd.DataFrame({'revenue': [12000, 15000, 18000, 16000],
}, index=pd.date_range('2023-01-01', periods=4, freq='ME'))# 升采样到日频率
daily_upsampled = monthly_data.resample('D').asfreq()
print("\n升采样到日频率(不填充):")
print(daily_upsampled.head(10))# 前向填充
ffilled = monthly_data.resample('D').ffill()
print("\n前向填充:")
print(ffilled.head(10))# 线性插值
interpolated = monthly_data.resample('D').interpolate(method='linear')
print("\n线性插值:")
print(interpolated.head(10))

输出:

升采样到日频率(不填充):revenue
2023-01-31  12000.0
2023-02-01      NaN
2023-02-02      NaN
2023-02-03      NaN
2023-02-04      NaN
2023-02-05      NaN
2023-02-06      NaN
2023-02-07      NaN
2023-02-08      NaN
2023-02-09      NaN前向填充:revenue
2023-01-31    12000
2023-02-01    12000
2023-02-02    12000
2023-02-03    12000
2023-02-04    12000
2023-02-05    12000
2023-02-06    12000
2023-02-07    12000
2023-02-08    12000
2023-02-09    12000线性插值:revenue
2023-01-31  12000.000000
2023-02-01  12107.142857
2023-02-02  12214.285714
2023-02-03  12321.428571
2023-02-04  12428.571429
2023-02-05  12535.714286
2023-02-06  12642.857143
2023-02-07  12750.000000
2023-02-08  12857.142857
2023-02-09  12964.285714

重采样频率别名大全

别名描述别名描述
B工作日QS季度开始
C自定义工作日BQS工作季度开始
D日历日A, Y年结束
WBA, BY工作年结束
M月结束AS, YS年开始
BM工作月结束BAS, BYS工作年开始
MS月开始BH工作小时
BMS工作月开始H小时
Q季度结束T, min分钟
BQ工作季度结束S
QS季度开始L, ms毫秒
BQS工作季度开始U, us微秒
A, Y年结束N纳秒

组合频率示例:

  • 5min:5分钟

  • 1H30min:1小时30分钟

  • W-MON:以周一为起始的周

  • QS-JAN:从一月开始的季度

  • BQ-MAR:从三月开始的工作季度

Pandas 支持多种聚合函数,可以根据需要选择:

常用聚合函数

  • mean():平均值

  • sum():求和

  • min():最小值

  • max():最大值

  • median():中位数

  • first():第一个值

  • last():最后一个值

  • ohlc():开盘、最高、最低、收盘(金融分析常用)

  • count():计数

  • std():标准差

  • var():方差

升采样中的填充方法

当进行升采样时,需要处理新增时间点的数据缺失问题:

方法描述适用场景
ffill()前向填充数据变化缓慢的场景
bfill()后向填充近期数据更重要的场景
interpolate()插值数据连续变化的场景
nearest()最近邻填充分类数据或离散数据
asfreq()返回NaN仅改变频率,不填充数据
pad()同ffillffill的别名
fillna()自定义填充需要特定填充逻辑的场景

四、时间序列窗口操作

窗口操作是时间序列分析的核心技术,它允许我们对时间序列数据的移动子集进行计算。Pandas 提供了三种主要的窗口操作类型:滚动窗口(rolling)扩展窗口(expanding)指数加权窗口(ewm)

窗口操作类型概览

窗口类型描述特点适用场景
滚动窗口(Rolling)固定大小的窗口沿时间轴滑动窗口大小固定短期趋势分析、平滑数据
扩展窗口(Expanding)窗口从起始点扩展到当前点窗口随时间增大累积统计量、长期趋势分析
指数加权窗口(EWM)对历史数据赋予指数衰减权重近期数据权重更高时间序列预测、金融分析

rolling()方法:

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)

参数说明:

参数描述默认值示例
window窗口大小(整数或时间字符串)必填5, '30D', '2H'
min_periods计算所需的最小观测值数量window1, 3
center是否将结果居中(而非右对齐)FalseTrue
win_type窗口类型(权重分配方式)None'triang', 'gaussian'
on指定用于计算的时间列None'date'
axis应用方向00(行方向)
closed窗口闭合端None'left', 'right'

滚动窗口(Rolling Window)示例:

import pandas as pd
import numpy as np
​
# 创建时间序列数据
dates = pd.date_range('2023-01-01', periods=30, freq='D')
data = pd.DataFrame({'value': np.sin(np.linspace(0, 4 * np.pi, 30)) * 100 + 500
}, index=dates)
print(data)
# 7天滚动平均
data['rolling_7d'] = data['value'].rolling(window=7).mean()
​
# 5天时间窗口
data['rolling_5d_time'] = data['value'].rolling('5D').mean()
​
print("\n滚动窗口操作:")
print(data.head(10))

expanding()方法:

DataFrame.expanding(min_periods=1, center=False, axis=0)

参数说明:

参数描述默认值示例
min_periods计算所需的最小观测值数量13
center是否将结果居中FalseTrue
axis应用方向0(行方向)1(列方向)

扩展窗口(Expanding Window)示例:

data  # 扩展窗口计算
data['expanding_mean'] = data['value'].expanding().mean()
data['expanding_max'] = data['value'].expanding().max()print("\n扩展窗口操作:")
print(data[['value', 'expanding_mean', 'expanding_max']].head(10))

ewm()方法:

DataFrame.ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0, times=None)

参数说明:

参数描述默认值相互关系
com质心(Center of Mass)None$\alpha = 1/(1 + com)$
span衰减跨度None$\alpha = 2/(span + 1)$
halflife半衰期None$\alpha = 1 - \exp(\ln(0.5)/halflife)$
alpha平滑因子None直接指定
min_periods最小观测值数0-
adjust是否调整初始值True-
ignore_na是否忽略NaNFalse-
axis应用方向0-
times时间间隔None-

指数加权移动平均(EWMA)

# 指数加权移动平均
data['ewma_span10'] = data['value'].ewm(span=10).mean()
data['ewma_alpha02'] = data['value'].ewm(alpha=0.2).mean()print("\n指数加权移动平均:")
print(data[['value', 'ewma_span10', 'ewma_alpha02']].head(10))


http://www.hkcw.cn/article/OTKmhonkIU.shtml

相关文章

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块

房屋租赁系统 JavaVue.jsSpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块 百度云盘链接:https://pan.baidu.com/s/16YRGBPsfbd4_HxXhO0jM5Q 密码:smk4 摘 要 房屋是人类生活栖息的重要…

【PowerQuery专栏】Record.Combine 函数实现记录连接

Record.Combine 函数功能是将多个不同的记录进行合并,函数目前包含如下参数: 参数1为合并记录,数据类型为列表类型,值为需要进行合并操作的记录 函数的结果为记录类型,图为函数参数。 Record.Combine(record as lis…

C++标准模板库

C标准库参考: C 标准库-CSDN博客 标准模板库STL C 标准库 和 STL 的关系 1. 严格来说,STL ≠ C 标准库 STL(Standard Template Library) 是 C 标准库的一个子集,主要提供泛型编程相关的组件(如容器、迭代器…

Grafana对接Prometheus数据源

实验环境 在上一章的基础上完成 一、Grafana介绍 Grafana是一个独立的开源项目,它可以对接很多项目,实现各种功能的扩展 使用grafana对接Prometheus可以更好的展示Prometheus的metrics(指标) 二、Grafana安装 1、安装Grafana…

Flex弹性布局

Flexible Box(弹性盒子)布局是CSS3中引入的一种强大的布局模式,它能够更高效地处理容器内项目的排列、对齐和空间分配问题,特别适合构建响应式设计。 基本属性 Flex容器:设置了display: flex或display: inline-flex的…

Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)

Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期) watch监视 情况三:监视reactive定义的对象类型的数据 监视reactive定义的对象类型的数据,默认开启深度监视。地址没变,新值和旧…

AI书签管理工具开发全记录(九):用户端页面集成与展示

文章目录 AI书签管理工具开发全记录(九):用户端页面集成与展示前言设计思路实现步骤1. 路由配置2. 全局样式设置3. 首页实现4. Vite配置 设计说明1. 部分UI设计2. 响应式布局3. 加载更多功能 效果展示效果展示 AI书签管理工具开发全记录&…

基于IRI-2020模型的电离层特征参量计算与可视化

1. 研究背景 电离层是地球大气层中重要的组成部分,位于地面以上约60-1000公里高度范围内,包含大量自由电子和离子。电离层对无线电通信、卫星导航和空间天气监测等现代技术系统具有重要影响。国际参考电离层模型(IRI)是由国际空间研究委员会(COSPAR)和国…

Chapter 10 Inductive DC–DC Converters

Chapter 10 Inductive DC–DC Converters Design of Power Management Integrated Circuits - Bernhard Wicht 电感型DC-DC用电感做功率转换, 因为有开关, 也被称为开关型DC-DC. 电感型DC-DC相比LDO, 效率更高, 但是不那么"干净". 相比于电容型DC-DC (switched cap…

美股收涨 世纪铝业涨超21% 金属板块领涨市场

美东时间周一,美股三大指数集体收涨。道指涨0.08%,纳指涨0.67%,标普500指数涨0.41%。热门科技股多数上涨,AMD、Meta涨幅超过3%,超微电脑接近3%,博通超过2%,英伟达超过1%。特斯拉和谷歌跌幅超过1%。贵金属和金属原材料板块表现突出,世纪铝业涨幅超过21%,黄金资源超过16…

最大规模换俘 领导人会晤 俄乌再谈判有乾坤

当地时间6月2日,俄乌两国代表团在土耳其伊斯坦布尔就和平解决俄乌冲突举行第二轮直接谈判。谈判历时约一小时,于当地时间16时许结束。5月第一轮谈判后,乌称“毫无成果”,俄称“基本满意”。而本次土耳其总统埃尔多安则表示谈判取得了“重大成果”。俄乌双方就大规模换俘、交…

国足抵达雅加达备战世预赛18强赛 关键战在即

中国男足国家队于6月2日晚抵达印度尼西亚首都雅加达,准备参加5日在那里举行的2026美加墨世界杯亚洲区预选赛18强赛第9轮对阵印尼队的关键比赛。当地时间晚上10点30分,中国队在主教练伊万科维奇的带领下走出雅加达苏加诺-哈达国际机场,并登上大巴前往酒店。伊万科维奇在机场接…

尼日利亚洪灾致200余人遇难 救援工作已停止

尼日利亚洪灾致200余人遇难 救援工作已停止!当地时间6月2日,尼日利亚尼日尔州莫夸地方政府副主席穆萨金布库证实,近期洪灾导致的死亡人数已增至200人,另有500多人失踪。他表示救援工作已经停止,认为失踪人员已无生还可能。目前工作人员正加紧掩埋尸体,以防止疾病蔓延。5月…

②Pybullet干涉检查指令getContactPoints与 getClosestPoints介绍

1、指令格式说明 getContactPoints指令说明 该指令根据最近一次调用stepSimulation指令,返回接触点信息。它的输入参数信息如下所示; 该指令执行后在有干涉的情况下返回信息如下所示。没有干涉时,返回数据为空。 以下为使用示例,该示例为机…

Vue-Leaflet地图组件开发(二)地图核心功能实现

第二篇:Vue-Leaflet地图核心功能实现 1. 地图视窗管理 1.1 视窗状态持久化方案 // 增强版视窗保存功能 const saveLocation async (options {}) > {try {const {saveToLocal true, // 默认保存到本地存储saveToServer false, // 是否保存到服务器notif…

DAY 37 超大力王爱学Python

知识点回顾: 过拟合的判断:测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint,还包含训练状态 早停策略 作业:对信贷数据集训练后保存权重,加载权重后继续训练50轮&#xf…

ubuntu 添加应用到启动菜单

使用Alacarte菜单编辑器 Alacarte是一个简单易用的菜单编辑器,可以帮助用户添加、删除或编辑应用程序的启动菜单项。 安装Alacarte sudo apt-get install alacarte 执行alacarte alacarte 使用说明 选择新建项目进行添加 "Name"栏填自定义的名称&quo…

3,信号与槽机制

这里绘制好了QT控件,现在需要点击控件,出现相应的响应操作 目录 法一 通过图形界面编写: 1,鼠标选中控件 ,右击,点击转到槽 选择相应的触发操作, 在widget.cpp和widget.h,分别自动增加如下代码: 需要手动添加进程头文件 : 查找QProcess如何使用 保存修改,并…

贪心算法应用:最小反馈顶点集问题详解

贪心算法应用:最小反馈顶点集问题详解 1. 问题定义与背景 1.1 反馈顶点集定义 反馈顶点集(Feedback Vertex Set, FVS)是指在一个有向图中,删除该集合中的所有顶点后,图中将不再存在任何有向环。换句话说,反馈顶点集是破坏图中所…

【Doris基础】Apache Doris中的Version概念解析:深入理解数据版本管理机制

目录 引言 1 Version概念基础 1.1 什么是Version 1.2 Version的核心作用 1.3 Version相关核心概念 2 Version工作机制详解 2.1 Version在数据写入流程中的作用 2.2 Version在数据查询流程中的作用 2.3 Version的存储结构 3 Version的进阶特性 3.1 Version的合并与压…