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中的实现
May 04 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
Python提取频域特征知识点浅析
Mar 04 Python
python ChainMap的使用和说明详解
Jun 11 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
JS中的三个循环小结
2017/06/20 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
使用Python写CUDA程序的方法
2017/03/27 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
python中reload重载实例用法
2020/12/15 Python
python爬取微博评论的实例讲解
2021/01/15 Python
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
高二政治教学反思
2014/02/01 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
同学聚会策划方案
2014/06/06 职场文书
党支部三会一课计划
2014/09/24 职场文书
应收账款管理制度
2015/08/06 职场文书