Pandas时间序列:时期(period)及其算术运算详解


Posted in Python onFebruary 25, 2020

import pandas as pd
import numpy as np

一、时间类型及其在python中对应的类型

时间戳?timestamp

时间间隔?timedelta

时期?period

二、时期

时期表示的是时间区间,比如数日、数月、数季、数年等

1.定义一个Period

p = pd.Period(2007,freq='A-DEC') #表示以12月作为结束的一整年,这里表示从2007-01-01到2017-12-31的全年
p

Period('2007', 'A-DEC')

2.通过加减整数可以实现对Period的移动

p+5

Period('2012', 'A-DEC')

p-2

Period('2005', 'A-DEC')

3.如果两个Period对象拥有相同频率,则它们的差就是它们之间的单位数量

pd.Period('2014',freq='A-DEC') - p

4.period_range函数可用于创建规则的时期范围

rng = pd.period_range('1/1/2000','6/30/2000',freq='M') #创建从2001-01-01到2000-06-30所有月份的Period
pd.Series(np.random.randn(6),index=rng)

2000-01 -1.125053
2000-02 1.035250
2000-03 -0.796830
2000-04 0.381285
2000-05 0.533522
2000-06 -2.733462
Freq: M, dtype: float64

5.PeriodIndex类的构造函数允许直接使用一组字符串表示一段时期

values = ['2001Q3','2002Q2','2003Q1']
index = pd.PeriodIndex(values,freq='Q-DEC')
index

PeriodIndex(['2001Q3', '2002Q2', '2003Q1'], dtype='period[Q-DEC]', freq='Q-DEC')

三、时期的频率转换-asfreq

1.通过asfreq可以将频率转换

p = pd.Period('2007',freq='A-DEC') # 2007年1月1日到2007年12月31日

p.asfreq('M',how='start') # 将评率为年(20070101-20071231)转换频率为月201701

Period('2007-01', 'M')

p.asfreq('M',how='end') # 将评率为年(20070101-20071231)转换频率为月201712

Period('2007-12', 'M')

2.不同频率经过asfreq转换后的结果不同

p = pd.Period('2007',freq='A-JUN') # 2006年7月1日到2007年6月30日

p.asfreq('D','start')

Period('2006-07-01', 'D')

p.asfreq('D','end')

Period('2007-06-30', 'D')

3.从高频率转换为低频率时,超时期(较大的时期)是由子时期(较小的时期)的位置绝对的

p = pd.Period('2007-08','M')

p.asfreq('A-JUN') # 200708对于频率A-JUN是属于2008年度的

Period('2008', 'A-JUN')

4.对于PeriodIndex或TimeSeries的频率转换方式相同

rng = pd.period_range('2006','2009',freq='A-DEC')

ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts

2006 -1.202858
2007 -1.132553
2008 0.902564
2009 0.800859
Freq: A-DEC, dtype: float64

ts.asfreq('M',how='start')

2006-01 -1.202858
2007-01 -1.132553
2008-01 0.902564
2009-01 0.800859
Freq: M, dtype: float64

ts.asfreq('B',how='end')

2006-12-29 -1.202858
2007-12-31 -1.132553
2008-12-31 0.902564
2009-12-31 0.800859
Freq: B, dtype: float64

四、按季度计算的时期频率

许多季度型数据会涉及“财年末”的概念,通常是一年12个月中某月的最后一个工作日或日历日。因此,时间“2012Q4”根据财年末的不同会有不同的含义。pandas支持12种可能的季度型频率,即Q-JAN到Q-DEC。

1.财政年度和季度

p = pd.Period('2012Q4',freq='Q-JAN') # Q-JAN是指1月末的工作日是财政年末
p

Period('2012Q4', 'Q-JAN')

p.asfreq('D','start')

Period('2011-11-01', 'D')

p.asfreq('D','end')

Period('2012-01-31', 'D')

2.该季度倒数第二个工作日的下午4点

p4pm = (p.asfreq('B','e')-1).asfreq('T','s')+16*60
p4pm.to_timestamp()

Timestamp('2012-01-30 16:00:00')

3.相同的运算可以应用到TimeSeries

rng = pd.period_range('2011Q3','2012Q4',freq='Q-JAN')
ts = pd.Series(np.arange(len(rng)),index=rng)
ts
2011Q3 0
2011Q4 1
2012Q1 2
2012Q2 3
2012Q3 4
2012Q4 5
Freq: Q-JAN, dtype: int32
new_rng = (rng.asfreq('B','e')-1).asfreq('T','s')+16*60
ts.index = new_rng.to_timestamp()
ts
2010-10-28 16:00:00 0
2011-01-28 16:00:00 1
2011-04-28 16:00:00 2
2011-07-28 16:00:00 3
2011-10-28 16:00:00 4
2012-01-30 16:00:00 5
dtype: int32

五、Timestamp与Period互相转换

1.通过to_period方法,可以将时间戳(timestamp)索引的Series和DataFrame对象转换为以时期(period)索引

rng = pd.date_range('1/1/2000',periods=3,freq='M')
ts = pd.Series(np.random.randn(3),index=rng)
ts
2000-01-31 -0.501502
2000-02-29 -1.299610
2000-03-31 -0.705091
Freq: M, dtype: float64

pts = ts.to_period()
pts

2000-01 -0.501502
2000-02 -1.299610
2000-03 -0.705091
Freq: M, dtype: float64

2.将timestamp转换为period是运行重复的

rng = pd.date_range('1/29/2000',periods=6,freq='D')
ts2 = pd.Series(np.random.randn(6),index=rng)
ts2.to_period('M')
2000-01 1.368367
2000-01 -0.256934
2000-01 0.417902
2000-02 -1.065910
2000-02 -1.694405
2000-02 0.665471
Freq: M, dtype: float64

3.to_timestamp可以将period转换为timestamp

pts.to_timestamp(how='end')

2000-01-31 -0.501502
2000-02-29 -1.299610
2000-03-31 -0.705091
Freq: M, dtype: float64

六、通过数组创建PeriodIndex

某些数据集中时间信息是分开在多个列存放的,可以通过PeriodIndex的参数将这些列组合在一起

year = [2017,2017,2017,2017,2018,2018,2018,2018]
quarter = [1,2,3,4,1,2,3,4]
index = pd.PeriodIndex(year=year,quarter=quarter,freq='Q-DEC')
index
PeriodIndex(['2017Q1', '2017Q2', '2017Q3', '2017Q4', '2018Q1', '2018Q2',
    '2018Q3', '2018Q4'],
   dtype='period[Q-DEC]', freq='Q-DEC')

以上这篇Pandas时间序列:时期(period)及其算术运算详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python多线程编程中的join函数使用心得
Sep 02 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
python中的装饰器详解
Apr 13 Python
python数组过滤实现方法
Jul 27 Python
python生成二维码的实例详解
Oct 29 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
python实现AES和RSA加解密的方法
Mar 28 Python
学习python分支结构
May 17 Python
python中的协程深入理解
Jun 10 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
通过python检测字符串的字母
Feb 18 Python
Python中全局变量和局部变量的理解与区别
Feb 07 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 #Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 #Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 #Python
Python对wav文件的重采样实例
Feb 25 #Python
python实现打砖块游戏
Feb 25 #Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 #Python
Django 设置多环境配置文件载入问题
Feb 25 #Python
You might like
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
Python中的is和id用法分析
2015/01/26 Python
Python中的自省(反射)详解
2015/06/02 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
关于安全的演讲稿
2014/05/09 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
物业工程部岗位职责
2015/02/11 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python