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设置windows桌面壁纸的实现代码
Jan 28 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
virtualenv实现多个版本Python共存
Aug 21 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
opencv实现简单人脸识别
Feb 19 Python
Python 日期的转换及计算的具体使用详解
Jan 16 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
通过Python实现一个简单的html页面
May 16 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
python实现简单石头剪刀布游戏
Oct 24 Python
Python Matplotlib库实现画局部图
Nov 17 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之apc
2013/05/15 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
js实现在同一窗口浏览图片
2014/09/17 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python中反射和描述器总结
2018/09/23 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python输出指定字符串的方法
2020/02/06 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
C语言开发工程师测试题
2016/12/20 面试题
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
全神贯注教学反思
2014/02/03 职场文书
药店促销活动策划方案
2014/08/24 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
安全月宣传标语
2014/10/07 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
怎样写观后感
2015/06/19 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS