Pandas 时间序列
# 导入相关库
import numpy as np
import pandas as pd
在做金融领域方面的分析时,经常会对时间进行一系列的处理。Pandas 内部自带了很多关于时间序列相关的工具,所以它非常适合处理时间序列。在处理时间序列的过程中,我们经常会去做以下一些任务:
- 生成固定频率日期和时间跨度的序列
- 将时间序列整合或转换为特定频率
- 基于各种非标准时间增量(例如,在一年的最后一个工作日之前的 5 个工作日)计算“相对”日期,或向前或向后“滚动”日期
使用 Pandas 可以轻松完成以上任务
基础概述
下面列出了 Pandas中 和时间日期相关常用的类以及创建方法:

Pandas 中关于时间序列最常见的类型就是时间戳( Timestamp )了,创建时间戳的方法有很多种,我们分别来看一看
时间戳(Timestamp)
pd.Timestamp(2019, 11, 7) # Timestamp('2019-11-07 00:00:00')
pd.Timestamp("2019-11-7") # Timestamp('2019-11-07 00:00:00')
pd.to_datetime("2019-11-7") # Timestamp('2019-11-07 00:00:00')
除了时间戳之外,另一个常见的结构是时间跨度( Period )
时间跨度(Period)
freq 为频率周期参数,D 为日,M 为月
pd.Period("2019-11") # Period('2019-11', 'M')
pd.Period("2019-11-7") # Period('2019-11-07', 'D')
pd.Period("2019-11", freq="D") # Period('2019-11-01', 'D')
基于时间的索引
Timestamp 和 Period 可以是索引。将 Timestamp 和 Period 作为 Series 或 DataFrame 的索引后会自动强制转为 DatetimeIndex 和 PeriodIndex
Timestamp 作为索引
dates = [
pd.Timestamp("2019-11-01"),
pd.Timestamp("2019-11-02"),
pd.Timestamp("2019-11-03"),
pd.Timestamp("2019-11-04")
]
ts = pd.Series(data=["Tom", "Bob", "Mary", "James"], index=dates)
ts
"""
2018-05-01 Tom
2018-05-02 Bob
2018-05-03 Mary
2018-05-04 James
dtype: object
"""
ts.index
"""
DatetimeIndex(['2018-05-01', '2018-05-02', '2018-05-03', '2018-05-04'], dtype='datetime64[ns]', freq=None)
"""
Period 作为索引
periods = [
pd.Period("2018-01"),
pd.Period("2018-02"),
pd.Period("2018-03"),
pd.Period("2018-4")
]
ts = pd.Series(data=["Tom", "Bob", "Mary", "James"], index=periods)
ts
"""
2018-01 Tom
2018-02 Bob
2018-03 Mary
2018-04 James
Freq: M, dtype: object
"""
ts.index
"""
PeriodIndex(['2018-01', '2018-02', '2018-03', '2018-04'], dtype='period[M]', freq='M')
"""
转换时间戳
你可能会想到,我们经常要和文本数据(字符串)打交道,能否快速将文本数据转为时间戳呢?答案是可以的,通过 to_datetime 能快速将字符串转换为时间戳。当传递一个Series时,它会返 回一个Series(具有相同的索引),而类似列表的则转换为 DatetimeIndex
to_datetime 将字符串转换为时间戳
pd.to_datetime(pd.Series(["Jul 31, 2019", "2019-11-10", None]))
"""
0 2019-07-31
1 2019-11-10
2 NaT
dtype: datetime64[ns]
""" pd.to_datetime(["2008/8/28", "2008.9.25"])
"""
DatetimeIndex(['2008-08-28', '2008-09-25'], dtype='datetime64[ns]', freq=None)
"""
将 unix 时间转为时间戳
pd.to_datetime([1349720105, 1349806505, 1349892905], unit="s")
"""
DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
'2012-10-10 18:15:05'],
dtype='datetime64[ns]', freq=None)
""" pd.to_datetime([1349720105100, 1349720105200, 1349720105300], unit="ms")
"""
DatetimeIndex(['2012-10-08 18:15:05.100000', '2012-10-08 18:15:05.200000',
'2012-10-08 18:15:05.300000'],
dtype='datetime64[ns]', freq=None)
"""
生成时间戳范围
有时候,我们可能想要生成某个范围内的时间戳。例如,我想要生成 "2019-10-1" 这一天之后的8 天时间戳,如何完成呢?我们可以使用 date_range 和 bdate_range 来完成时间戳范围的生成。
生成某个范围内的时间戳
date_range 默认使用的频率是日历日
bdate_range 默认使用的频率是营业日
pd.date_range("2019-10-1", periods=7)
"""
DatetimeIndex(['2019-10-01', '2019-10-02', '2019-10-03', '2019-10-04',
'2019-10-05', '2019-10-06', '2019-10-07'],
dtype='datetime64[ns]', freq='D')
"""
pd.bdate_range("2019-10-1", periods=7)
"""
DatetimeIndex(['2019-10-01', '2019-10-02', '2019-10-03', '2019-10-04',
'2019-10-07', '2019-10-08', '2019-10-09'],
dtype='datetime64[ns]', freq='B')
"""
按周来生成时间戳范围
pd.date_range("2019-10-1", periods=7, freq="W")
"""
DatetimeIndex(['2019-10-06', '2019-10-13', '2019-10-20', '2019-10-27',
'2019-11-03', '2019-11-10', '2019-11-17'],
dtype='datetime64[ns]', freq='W-SUN')
"""
DatetimeIndex
DatetimeIndex 的主要作用之一是用作 Pandas 对象的索引,使用它作为索引除了拥有普通索引对象的所有基本功能外,还拥有简化频率处理的高级时间序列方法
rng = pd.date_range("2019-10-1", periods=4, freq="W")
ts = pd.Series(range(len(rng)), index=rng)
ts
"""
2019-10-06 0
2019-10-13 1
2019-10-20 2
2019-10-27 3
Freq: W-SUN, dtype: int64
"""
通过日期访问数据
ts["2019-10-20"] #
通过日期区间访问数据切片
ts["2019-10-13": "2019-10-20"]
"""
2019-10-13 1
2019-10-20 2
Freq: W-SUN, dtype: int64
"""
传入年份
ts[""]
传入年份和月份
ts["2019-10"]
datetime 进行索引
from datetime import datetime
ts[datetime(2019, 10, 6) : datetime(2019, 10, 13)]
获取年份
ts.index.year
获取星期几
ts.index.dayofweek
获取一年中的第几个星期
ts.index.weekofyear
DateOffset 对象
DateOffset 是做日期偏移的,它的参数与 dateutil.relativedelta 基 本相同,工作方式如下:
from pandas.tseries.offsets import *
d = pd.Timestamp("2019-10-06")
d + DateOffset(weeks=2, days=5)
"""
Timestamp('2019-10-25 00:00:00')
"""
除了可以使用 DateOffset 完成上面的功能外,还可以使用偏移量实例来完成:
from pandas.tseries.offsets import *
d = pd.Timestamp("2019-10-06")
d + Week(2) + Day(5)
与时间序列相关的方法
在做时间序列相关的工作时,经常要对时间做一些移动/滞后、频率转换、采样等相关操作。
移动时间序列
如果你想移动或滞后时间序列,你可以使用 shift 方法
ts.shift(2)
"""
2019-10-06 NaN
2019-10-13 NaN
2019-10-20 0.0
2019-10-27 1.0
Freq: W-SUN, dtype: float64
"""
可以看到,Series 所有的值都都移动了 2 个距离。如果不想移动值,而是移动日期索引,可以使 用 freq 参数,它可以接受一个 DateOffset 类或其他 timedelta 类对象或一个 offset 别名
ts.shift(2, freq=Day())
"""
2019-10-08 0
2019-10-15 1
2019-10-22 2
2019-10-29 3
Freq: W-TUE, dtype: int64
"""
通过 tshift 同样可以达到相同的效果:
ts.tshift(2, freq=Day())
频率转换
频率转换可以使用 asfreq 函数来实现
# 将频率由周转为了天
ts.asfreq(Day())
但是我们发现出现了缺失值,因此 Pandas 提供了 method 参数来填充缺失值。几种不同的填充方法参考 Pandas 缺失值处理 中 fillna 介绍。
ts.asfreq(Day(), method="pad")
重采样
resample 表示根据日期维度进行数据聚合,可以按照分钟、小时、工作日、周、月、年等来作为日期维度
这里我们以月来作为时间维度来进行聚合
# 求出每个月的数值之和
ts.resample("1M").sum() # 求出每个月的数值平均值
ts.resample("1M").mean()
Pandas 时间序列的更多相关文章
- Pandas时间序列
Pandas时间序列 pandas 提供了一组标准的时间序列处理工具和数据算法 数据类型及操作 Python 标准库的 datetime datetime 模块中的 datetime. time. c ...
- Pandas 时间序列处理
目录 Pandas 时间序列处理 1 Python 的日期和时间处理 1.1 常用模块 1.2 字符串和 datetime 转换 2 Pandas 的时间处理及操作 2.1 创建与基础操作 2.2 时 ...
- Python Pandas 时间序列双轴折线图
时间序列pv-gmv双轴折线图 import numpy as np import pandas as pd import matplotlib.pyplot as plt n = 12 date_s ...
- pandas时间序列滑窗
时间序列数据统计-滑动窗口 窗口函数 import pandas as pd import numpy as np ser_obj = pd.Series(np.random.randn(1000), ...
- Pandas时间序列和分组聚合
#时间序列import pandas as pd import numpy as np # 生成一段时间范围 ''' 该函数主要用于生成一个固定频率的时间索引,在调用构造方法时,必须指定start.e ...
- pandas时间序列常用操作
目录 一.时间序列是什么 二.时间序列的选取 三.时间序列的生成 四.时间序列的偏移量 五.时间前移或后移 五.时区处理 六.时期及算术运算 七.频率转换 一.时间序列是什么 时间序列在多个时间点观察 ...
- pandas时间序列学习笔记
目录 创建一个时间序列 pd.date_range() info() asfred() shifted(),滞后函数 diff()求差分 加减乘除 DataFrame.reindex() 通过data ...
- Python——Pandas 时间序列数据处理
介绍 Pandas 是非常著名的开源数据处理库,我们可以通过它完成对数据集进行快速读取.转换.过滤.分析等一系列操作.同样,Pandas 已经被证明为是非常强大的用于处理时间序列数据的工具.本节将介绍 ...
- pandas 时间序列resample
resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...
随机推荐
- Zookeeper监控(Zabbix)
一直在弄监控,这些个中间件Zookeeper.Kafka......,平时也只知道一点皮毛,也就搭建部署过,没有真正的用过,一般都是大数据的同学在用,作为运维人员我需要对他做一个监控,由于对他不是 ...
- 实战SpringCloud响应式微服务系列教程(第七章)
本章节继续介绍:Flux和Mono操作符(二) 1.条件操作符 Reactor中常用的条件操作符有defaultIfRmpty.skipUntil.skipWhile.takeUntil和takeWh ...
- spring5 源码深度解析----- @Transactional注解的声明式事物介绍(100%理解事务)
面的几个章节已经分析了spring基于@AspectJ的源码,那么接下来我们分析一下Aop的另一个重要功能,事物管理. 事务的介绍 1.数据库事物特性 原子性多个数据库操作是不可分割的,只有所有的操作 ...
- c#关于JWT跨域身份验证解决方案
学习程序,不是记代码,而是学习一种思想,以及对代码的理解和思考. JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.为了网络应用环境间传递声明而执行的一种基于JSON的开发标准 ...
- 二次函数,为什么a>0就可以知道开口向上.
最近自考. 学习高等数学. 学习高等数学过程中发现高中数学不会,,于是乎开始补高中数学. 学习高中数学过程中又发现初中数学有的不会,,于是乎开始补初中数学.. 可怕(→_→). 今天遇到一个二次函数, ...
- ES6 —— entries(),keys()和values()
ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组.它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的 ...
- C#常见的算法面试题
一.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m //方法一,通过顺序规律写程序,同时也知道flag标志位的重要性. static int F1(int m) { in ...
- e课表项目第二次冲刺周期第六天
昨天干了什么? 昨天是这次冲刺周期的第五天,我们的冲刺周期已经快过了一半,我们已经实现了对第一层界面的设计,所以我们的进度和我们的时间正好吻合,所以我们有信心完成我们的软件.我在网上搜了一些关于监听的 ...
- CentOS 7 的 systemctl 命令
Centos 7.* 使用 Systemd 进行系统初始化,因此,Centos 7.* 中我们可以使用 systemctl 管理系统中的服务. systemctl 管理的服务均包含了一个以 .serv ...
- formidable处理提交的表单或文件的简单介绍
一般来说,客户端向服务端提交数据有GET和POST这两种方式,在之前的文章node.js当中的http模块与url模块的简单介绍当中我们可以知道通过req.url与url模块的配合处理可以快速得到客户 ...