1. # 导入相关库
  2. import numpy as np
  3. import pandas as pd

在做金融领域方面的分析时,经常会对时间进行一系列的处理。Pandas 内部自带了很多关于时间序列相关的工具,所以它非常适合处理时间序列。在处理时间序列的过程中,我们经常会去做以下一些任务:

  • 生成固定频率日期和时间跨度的序列
  • 将时间序列整合或转换为特定频率
  • 基于各种非标准时间增量(例如,在一年的最后一个工作日之前的 5 个工作日)计算“相对”日期,或向前或向后“滚动”日期

使用 Pandas 可以轻松完成以上任务

基础概述

  下面列出了 Pandas中 和时间日期相关常用的类以及创建方法:

  Pandas 中关于时间序列最常见的类型就是时间戳( Timestamp )了,创建时间戳的方法有很多种,我们分别来看一看

时间戳(Timestamp)

  1. pd.Timestamp(2019, 11, 7) # Timestamp('2019-11-07 00:00:00')
  2. pd.Timestamp("2019-11-7") # Timestamp('2019-11-07 00:00:00')
  3. pd.to_datetime("2019-11-7") # Timestamp('2019-11-07 00:00:00')

  除了时间戳之外,另一个常见的结构是时间跨度( Period )

时间跨度(Period)

  freq 为频率周期参数,D 为日,M 为月

  1. pd.Period("2019-11") # Period('2019-11', 'M')
  2. pd.Period("2019-11-7") # Period('2019-11-07', 'D')
  3. pd.Period("2019-11", freq="D") # Period('2019-11-01', 'D')

基于时间的索引

  Timestamp 和 Period 可以是索引。将 Timestamp 和 Period 作为 Series 或 DataFrame 的索引后会自动强制转为 DatetimeIndex 和 PeriodIndex

  Timestamp 作为索引

  1. dates = [
      pd.Timestamp("2019-11-01"),
      pd.Timestamp("2019-11-02"),
      pd.Timestamp("2019-11-03"),
      pd.Timestamp("2019-11-04")
    ]
  2. ts = pd.Series(data=["Tom", "Bob", "Mary", "James"], index=dates)
  3. ts
  4. """
  5. 2018-05-01 Tom
  6. 2018-05-02 Bob
  7. 2018-05-03 Mary
  8. 2018-05-04 James
  9. dtype: object
  10. """
  11. ts.index
  12. """
  13. DatetimeIndex(['2018-05-01', '2018-05-02', '2018-05-03', '2018-05-04'], dtype='datetime64[ns]', freq=None)
  14. """

  Period 作为索引

  1. periods = [
  2. pd.Period("2018-01"),
  3. pd.Period("2018-02"),
  4. pd.Period("2018-03"),
  5. pd.Period("2018-4")
  6. ]
  7. ts = pd.Series(data=["Tom", "Bob", "Mary", "James"], index=periods)
  8. ts
  9. """
  10. 2018-01 Tom
  11. 2018-02 Bob
  12. 2018-03 Mary
  13. 2018-04 James
  14. Freq: M, dtype: object
  15. """
  16. ts.index
  17. """
  18. PeriodIndex(['2018-01', '2018-02', '2018-03', '2018-04'], dtype='period[M]', freq='M')
  19. """

转换时间戳

  你可能会想到,我们经常要和文本数据(字符串)打交道,能否快速将文本数据转为时间戳呢?答案是可以的,通过 to_datetime 能快速将字符串转换为时间戳。当传递一个Series时,它会返 回一个Series(具有相同的索引),而类似列表的则转换为 DatetimeIndex

to_datetime 将字符串转换为时间戳

  1. pd.to_datetime(pd.Series(["Jul 31, 2019", "2019-11-10", None]))
  2. """
  3. 0 2019-07-31
  4. 1 2019-11-10
  5. 2 NaT
  6. dtype: datetime64[ns]
  7. """
  8.  
  9. pd.to_datetime(["2008/8/28", "2008.9.25"])
  10. """
  11. DatetimeIndex(['2008-08-28', '2008-09-25'], dtype='datetime64[ns]', freq=None)
  12. """

将 unix 时间转为时间戳

  1. pd.to_datetime([1349720105, 1349806505, 1349892905], unit="s")
  2. """
  3. DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
  4. '2012-10-10 18:15:05'],
  5. dtype='datetime64[ns]', freq=None)
  6. """
  7.  
  8. pd.to_datetime([1349720105100, 1349720105200, 1349720105300], unit="ms")
  9. """
  10. DatetimeIndex(['2012-10-08 18:15:05.100000', '2012-10-08 18:15:05.200000',
  11. '2012-10-08 18:15:05.300000'],
  12. dtype='datetime64[ns]', freq=None)
  13. """

生成时间戳范围

  有时候,我们可能想要生成某个范围内的时间戳。例如,我想要生成 "2019-10-1" 这一天之后的8 天时间戳,如何完成呢?我们可以使用 date_range 和 bdate_range 来完成时间戳范围的生成。

生成某个范围内的时间戳

  date_range 默认使用的频率是日历日

  bdate_range 默认使用的频率是营业日

  1. pd.date_range("2019-10-1", periods=7)
  2. """
  3. DatetimeIndex(['2019-10-01', '2019-10-02', '2019-10-03', '2019-10-04',
  4. '2019-10-05', '2019-10-06', '2019-10-07'],
  5. dtype='datetime64[ns]', freq='D')
  6. """
  7.  
  8. pd.bdate_range("2019-10-1", periods=7)
  9. """
  10. DatetimeIndex(['2019-10-01', '2019-10-02', '2019-10-03', '2019-10-04',
  11. '2019-10-07', '2019-10-08', '2019-10-09'],
  12. dtype='datetime64[ns]', freq='B')
  13. """

按周来生成时间戳范围

  1. pd.date_range("2019-10-1", periods=7, freq="W")
  2. """
  3. DatetimeIndex(['2019-10-06', '2019-10-13', '2019-10-20', '2019-10-27',
  4. '2019-11-03', '2019-11-10', '2019-11-17'],
  5. dtype='datetime64[ns]', freq='W-SUN')
  6. """

DatetimeIndex

  DatetimeIndex 的主要作用之一是用作 Pandas 对象的索引,使用它作为索引除了拥有普通索引对象的所有基本功能外,还拥有简化频率处理的高级时间序列方法

  1. rng = pd.date_range("2019-10-1", periods=4, freq="W")
  2. ts = pd.Series(range(len(rng)), index=rng)
  3. ts
  4. """
  5. 2019-10-06 0
  6. 2019-10-13 1
  7. 2019-10-20 2
  8. 2019-10-27 3
  9. Freq: W-SUN, dtype: int64
  10. """

通过日期访问数据

  1. ts["2019-10-20"] #

通过日期区间访问数据切片

  1. ts["2019-10-13": "2019-10-20"]
  2. """
  3. 2019-10-13 1
  4. 2019-10-20 2
  5. Freq: W-SUN, dtype: int64
  6. """

传入年份

  1. ts[""]

传入年份和月份

  1. ts["2019-10"]

datetime 进行索引

  1. from datetime import datetime
  2. ts[datetime(2019, 10, 6) : datetime(2019, 10, 13)]

获取年份

  1. ts.index.year

获取星期几

  1. ts.index.dayofweek

获取一年中的第几个星期

  1. ts.index.weekofyear

DateOffset 对象

  DateOffset 是做日期偏移的,它的参数与 dateutil.relativedelta 基 本相同,工作方式如下:

  1. from pandas.tseries.offsets import *
  2. d = pd.Timestamp("2019-10-06")
  3. d + DateOffset(weeks=2, days=5)
  4. """
  5. Timestamp('2019-10-25 00:00:00')
  6. """

  除了可以使用 DateOffset 完成上面的功能外,还可以使用偏移量实例来完成:

  1. from pandas.tseries.offsets import *
  2. d = pd.Timestamp("2019-10-06")
  3. d + Week(2) + Day(5)

与时间序列相关的方法

  在做时间序列相关的工作时,经常要对时间做一些移动/滞后、频率转换、采样等相关操作。

移动时间序列

  如果你想移动或滞后时间序列,你可以使用  shift  方法

  1. ts.shift(2)
  2. """
  3. 2019-10-06 NaN
  4. 2019-10-13 NaN
  5. 2019-10-20 0.0
  6. 2019-10-27 1.0
  7. Freq: W-SUN, dtype: float64
  8. """

  可以看到,Series 所有的值都都移动了 2 个距离。如果不想移动值,而是移动日期索引,可以使 用  freq  参数,它可以接受一个  DateOffset  类或其他  timedelta  类对象或一个 offset 别名

  1. ts.shift(2, freq=Day())
  2. """
  3. 2019-10-08 0
  4. 2019-10-15 1
  5. 2019-10-22 2
  6. 2019-10-29 3
  7. Freq: W-TUE, dtype: int64
  8. """

  通过 tshift 同样可以达到相同的效果:

  1. ts.tshift(2, freq=Day())

频率转换

  频率转换可以使用 asfreq 函数来实现

  1. # 将频率由周转为了天
  2. ts.asfreq(Day())

  但是我们发现出现了缺失值,因此 Pandas 提供了 method 参数来填充缺失值。几种不同的填充方法参考 Pandas 缺失值处理 中 fillna 介绍。

  1. ts.asfreq(Day(), method="pad")

重采样

  resample 表示根据日期维度进行数据聚合,可以按照分钟、小时、工作日、周、月、年等来作为日期维度

  这里我们以月来作为时间维度来进行聚合

  1. # 求出每个月的数值之和
  2. ts.resample("1M").sum()
  3.  
  4. # 求出每个月的数值平均值
  5. ts.resample("1M").mean()

Pandas 时间序列的更多相关文章

  1. Pandas时间序列

    Pandas时间序列 pandas 提供了一组标准的时间序列处理工具和数据算法 数据类型及操作 Python 标准库的 datetime datetime 模块中的 datetime. time. c ...

  2. Pandas 时间序列处理

    目录 Pandas 时间序列处理 1 Python 的日期和时间处理 1.1 常用模块 1.2 字符串和 datetime 转换 2 Pandas 的时间处理及操作 2.1 创建与基础操作 2.2 时 ...

  3. Python Pandas 时间序列双轴折线图

    时间序列pv-gmv双轴折线图 import numpy as np import pandas as pd import matplotlib.pyplot as plt n = 12 date_s ...

  4. pandas时间序列滑窗

    时间序列数据统计-滑动窗口 窗口函数 import pandas as pd import numpy as np ser_obj = pd.Series(np.random.randn(1000), ...

  5. Pandas时间序列和分组聚合

    #时间序列import pandas as pd import numpy as np # 生成一段时间范围 ''' 该函数主要用于生成一个固定频率的时间索引,在调用构造方法时,必须指定start.e ...

  6. pandas时间序列常用操作

    目录 一.时间序列是什么 二.时间序列的选取 三.时间序列的生成 四.时间序列的偏移量 五.时间前移或后移 五.时区处理 六.时期及算术运算 七.频率转换 一.时间序列是什么 时间序列在多个时间点观察 ...

  7. pandas时间序列学习笔记

    目录 创建一个时间序列 pd.date_range() info() asfred() shifted(),滞后函数 diff()求差分 加减乘除 DataFrame.reindex() 通过data ...

  8. Python——Pandas 时间序列数据处理

    介绍 Pandas 是非常著名的开源数据处理库,我们可以通过它完成对数据集进行快速读取.转换.过滤.分析等一系列操作.同样,Pandas 已经被证明为是非常强大的用于处理时间序列数据的工具.本节将介绍 ...

  9. pandas 时间序列resample

    resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...

随机推荐

  1. vue- Vue-Cli脚手架工具安装 -创建项目-页面开发流程-组件生命周期- -03

    目录 Vue-Cli 项目环境搭建 与 python 基础环境对比 环境搭建 创建启动 vue 项目 命令创建项目(步骤小多) 启动 vue 项目(命令行方式) 启动 vue 项目(pycharm 方 ...

  2. FFmpeg(二) 解封装相关函数理解

    一.解封装基本流程 ①av_register_All()////初始化解封装,注册解析和封装的格式. ②avformat_netword_init()//初始化网络,解析rtsp协议 ③avforma ...

  3. Ubuntu server 安装及jdk+mysql安装教程

    Ubuntu server 安装教程 1.查找及下载Ubuntu镜像文件 可以在以下页面下载想要的版本,我这里选择19.04 server版的iso镜像文件: http://mirrors.163.c ...

  4. jsp JavaBean el表达式

    JSP三大指令 一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:<%@page language="java" info="xx ...

  5. 04-02 AdaBoost算法

    目录 AdaBoost算法 一.AdaBoost算法学习目标 二.AdaBoost算法详解 2.1 Boosting算法回顾 2.2 AdaBoost算法 2.3 AdaBoost算法目标函数优化 三 ...

  6. Java 语言特点

    引入<Java核心技术:Ⅰ> 1. 简单性 Java 语法是 C++ 语法的一个“ 纯净” 版本.这里没有头文件. 指针运算(甚至指 针语法).结构. 联合.操作符重载. 虚基类等.如果你 ...

  7. Java中ArrayList和LinkedList的性能分析

    ArrayList和LinkedList是Java集合框架中经常使用的类.如果你只知道从基本性能比较ArrayList和LinkedList,那么请仔细阅读这篇文章. ArrayList应该在需要更多 ...

  8. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  9. window 下Notepad++设置为文本文件的默认打开程序失败

    1.右键Notepad++的可执行程序,选择"属性"  -- "兼容性" , 设置Notepad++以管理员的身份运行 2.打开Notepad++ ," ...

  10. opencv::点多边形测试

    点多边形测试 测试一个点是否在给定的多边形内部,边缘或者外部 double pointPolygonTest( InputArray contour, // 输入的轮廓 Point2f pt, // ...