Pandas时间序列:时期(period)及其算术运算详解
作者:BQW_ 发布时间:2022-09-25 07:34:38
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')
来源:https://blog.csdn.net/bqw18744018044/article/details/80947243


猜你喜欢
- 这篇文章主要介绍了flask的orm框架SQLAlchemy查询实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- reflow是个神奇的东西,之前Realazy说到过这个reflow,我摘出其中的重点:在CSS规范中有一个渲染对象的概念,通常用一个盒子(
- 像素是计算机视觉中图像的重要属性。它们是表示图像 * 定空间中光的颜色强度的数值,是图像中数据的最小单位。图像中的像素总数是高度、宽度和通道的
- 先举个例子,以前负责教育培训类网站的时候,曾经接到过这样一个项目,需求方希望做一个充满趣味性的新手入门频道,页面要炫,最好是flash,用户
- 前言WebStorm是一款强大的前端开发软件,vue是当前前端热门技术栈。对于WebStorm默认的配置,它会把vue当成文本文件处理,从而
- 前言配置火狐浏览器对应的selenium驱动一、火狐浏览器驱动下载下载地址根据对应的系统环境下载相应的压缩包(这里下载的是Windows系统
- 基于很多原因,有不少朋友的空间不支持FSO,当大量的页面生成静态页面时,占用大量的空间,修改样式时,不方便,所以动态页面还是有动态页面的好处
- 1.最基本的用法 把ClassA的一个实例赋值给ClassB, ClassB就继承了ClassA的所有属性。 代码入下: <
- 在实际使用python时,我们会将一些公共的东西写到一些基础模块中,供其他模块去调用,这时会去import自定义的一些基础模块,然后来导入。
- 阅读上一篇:一个完美网站的101项指标.第六部分.性能 符合 W3C 标准是网站的发展趋势,目前,几乎所有的浏览器都使用 W3C 标准,W3
- JsonServer主要的作用就是搭建本地的数据接口,创建json文件,便于调试调用是一个 Node 模块,运行 Express 服务器,可
- 比如有一个a = {‘a': 1}希望变为a = {‘b' :1}即:在保留value不变的情况下,替换key值目前能想到的
- 在开发过程中,收到这样一个问题反馈,在网站上传 100 MB 以上的文件经常失败,重试也要等老半天,这就难为需要上传大规格文件的用户了。那么
- 本文实例讲述了python打开url并按指定块读取网页内容的方法。分享给大家供大家参考。具体实现方法如下:import urllibpage
- MySQL中SQL Mode的查看与设置MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql
- 目录前言typeof是否能正确判断类型?instanceof是否能正确判断类型?Object.prototype.toString.call
- 我们看一个现象:import pandas as pdtitanic = pd.read_csv('titanic_data.csv
- 在上篇博客中,提到了对一个脚本进行的多次优化。当时以为已经优化得差不多了,但是当测试人员测试时,我才发现,踩到了Python的一个大坑。在上
- 数据库复制:简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改。复制的模式有两种:推送模式和请求
- Pycharm是一款很好用的python开发工具,开发Python爬虫和Python web方面都很不错这里我为大家提供了两种pycharm