joyful pandas第9章 时序数据

joyful pandas第9章 时序数据

  • 一、时序的创建
    • 1. 四类时间变量
    • 2. 时间点的创建
      • (a)to_datetime方法
      • (b)时间精度与范围限制
      • (c)date_range方法
    • 3. DateOffset对象
      • (a)DataOffset与Timedelta的区别
      • (b)增减一段时间
      • (c)各类常用offset对象
      • (d)序列的offset操作
  • 二、时序的索引及属性
    • 1. 索引切片
    • 2. 子集索引
    • 3. 时间点的属性
  • 三、重采样
    • 1. resample对象的基本操作
    • 2. 采样聚合
    • 3. 采样组的迭代
  • 四、窗口函数
    • 1. Rolling
      • (a)常用聚合
      • (b)rolling的apply聚合
      • (c)基于时间的rolling
    • 2. Expanding
      • a)expanding函数
      • (b)几个特别的Expanding类型函数
  • 五、问题与练习

import pandas as pd
import numpy as np

一、时序的创建

1. 四类时间变量

现在理解可能关于③和④有些困惑,后面会作出一些说明
joyful pandas第9章 时序数据_第1张图片

2. 时间点的创建

(a)to_datetime方法

Pandas在时间点建立的输入格式规定上给了很大的自由度,下面的语句都能正确建立同一时间点
joyful pandas第9章 时序数据_第2张图片
下面的语句都会报错
joyful pandas第9章 时序数据_第3张图片
此时可利用format参数强制匹配
joyful pandas第9章 时序数据_第4张图片
同时,使用列表可以将其转为时间点索引
joyful pandas第9章 时序数据_第5张图片
对于DataFrame而言,如果列已经按照时间顺序排好,则利用to_datetime可自动转换
joyful pandas第9章 时序数据_第6张图片

(b)时间精度与范围限制

事实上,Timestamp的精度远远不止day,可以最小到纳秒ns
在这里插入图片描述
同时,它带来范围的代价就是只有大约584年的时间点是可用的
joyful pandas第9章 时序数据_第7张图片

(c)date_range方法

一般来说,start/end/periods(时间点个数)/freq(间隔方法)是该方法最重要的参数,给定了其中的3个,剩下的一个就会被确定
joyful pandas第9章 时序数据_第8张图片
其中freq参数有许多选项,下面将常用部分罗列如下,更多选项可看这里
在这里插入图片描述
joyful pandas第9章 时序数据_第9张图片

bdate_range是一个类似与date_range的方法,特点在于可以在自带的工作日间隔设置上,再选择weekmask参数和holidays参数
它的freq中有一个特殊的’C’/‘CBM’/'CBMS’选项,表示定制,需要联合weekmask参数和holidays参数使用
例如现在需要将工作日中的周一、周二、周五3天保留,并将部分holidays剔除
joyful pandas第9章 时序数据_第10张图片

3. DateOffset对象

(a)DataOffset与Timedelta的区别

Timedelta绝对时间差的特点指无论是冬令时还是夏令时,增减1day都只计算24小时
DataOffset相对时间差指,无论一天是23\24\25小时,增减1day都与当天相同的时间保持一致
例如,英国当地时间 2020年03月29日,01:00:00 时钟向前调整 1 小时 变为 2020年03月29日,02:00:00,开始夏令时
joyful pandas第9章 时序数据_第11张图片
这似乎有些令人头大,但只要把tz(time zone)去除就可以不用管它了,两者保持一致,除非要使用到时区变换
joyful pandas第9章 时序数据_第12张图片

(b)增减一段时间

DateOffset的可选参数包括years/months/weeks/days/hours/minutes/seconds
在这里插入图片描述

(c)各类常用offset对象

在这里插入图片描述
joyful pandas第9章 时序数据_第13张图片

(d)序列的offset操作

利用apply函数
在这里插入图片描述
直接使用对象加减
在这里插入图片描述
定制offset,可以指定weekmask和holidays参数(思考为什么三个都是一个值)
在这里插入图片描述

二、时序的索引及属性

1. 索引切片

这一部分几乎与第二章的规则完全一致
joyful pandas第9章 时序数据_第14张图片
合法字符自动转换为时间点
joyful pandas第9章 时序数据_第15张图片

2. 子集索引

joyful pandas第9章 时序数据_第16张图片

3. 时间点的属性

采用dt对象可以轻松获得关于时间的信息

joyful pandas第9章 时序数据_第17张图片
利用strftime可重新修改时间格式

joyful pandas第9章 时序数据_第18张图片
对于datetime对象可以直接通过属性获取信息
joyful pandas第9章 时序数据_第19张图片

三、重采样

所谓重采样,就是指resample函数,它可以看做时序版本的groupby函数

1. resample对象的基本操作

采样频率一般设置为上面提到的offset字符
joyful pandas第9章 时序数据_第20张图片

joyful pandas第9章 时序数据_第21张图片

2. 采样聚合

joyful pandas第9章 时序数据_第22张图片
类似地,可以使用函数/lambda表达式
joyful pandas第9章 时序数据_第23张图片

3. 采样组的迭代

采样组的迭代和groupby迭代完全类似,对于每一个组都可以分别做相应操作
joyful pandas第9章 时序数据_第24张图片

四、窗口函数

下面主要介绍pandas中两类主要的窗口(window)函数:rolling/expanding
joyful pandas第9章 时序数据_第25张图片

1. Rolling

(a)常用聚合

所谓rolling方法,就是规定一个窗口,它和groupby对象一样,本身不会进行操作,需要配合聚合函数才能计算结果
joyful pandas第9章 时序数据_第26张图片
min_periods参数是指需要的非缺失数据点数量阀值
joyful pandas第9章 时序数据_第27张图片
count/sum/mean/median/min/max/std/var/skew/kurt/quantile/cov/corr都是常用的聚合函数

(b)rolling的apply聚合

使用apply聚合时,只需记住传入的是window大小的Series,输出的必须是标量即可,比如如下计算变异系数
joyful pandas第9章 时序数据_第28张图片

(c)基于时间的rolling

可选closed=‘right’(默认)‘left’‘both’'neither’参数,决定端点的包含情况

joyful pandas第9章 时序数据_第29张图片

2. Expanding

a)expanding函数

普通的expanding函数等价与rolling(window=len(s),min_periods=1),是对序列的累计计算
joyful pandas第9章 时序数据_第30张图片
apply方法也是同样可用的
joyful pandas第9章 时序数据_第31张图片

(b)几个特别的Expanding类型函数

cumsum/cumprod/cummax/cummin都是特殊expanding累计计算方法
joyful pandas第9章 时序数据_第32张图片
shift/diff/pct_change都是涉及到了元素关系
①shift是指序列索引不变,但值向后移动
②diff是指前后元素的差,period参数表示间隔,默认为1,并且可以为负
③pct_change是值前后元素的变化百分比,period参数与diff类似
joyful pandas第9章 时序数据_第33张图片

五、问题与练习

【问题一】 如何对date_range进行批量加帧操作或对某一时间段加大时间戳密度?
【问题二】 如何批量增加TimeStamp的精度?
【问题三】 对于超出处理时间的时间点,是否真的完全没有处理方法?
【问题四】 给定一组非连续的日期,怎么快速找出位于其最大日期和最小日期之间,且没有出现在该组日期中的日期?

【练习一】 现有一份关于某超市牛奶销售额的时间序列数据,请完成下列问题:
(a)销售额出现最大值的是星期几?(提示:利用dayofweek函数)
(b)计算除去春节、国庆、五一节假日的月度销售总额
(c)按季度计算周末(周六和周日)的销量总额
(d)从最后一天开始算起,跳过周六和周一,以5天为一个时间单位向前计算销售总和
(e)假设现在发现数据有误,所有同一周里的周一与周五的销售额记录颠倒了,请计算2018年中每月第一个周一的销售额(如果该周没有周一或周五的记录就保持不动)

【练习二】 继续使用上一题的数据,请完成下列问题:
(a)以50天为窗口计算滑窗均值和滑窗最大值(min_periods设为1)
(b)现在有如下规则:若当天销售额超过向前5天的均值,则记为1,否则记为0,请给出2018年相应的计算结果
(c)将©中的“向前5天”改为“向前非周末5天”,请再次计算结果

你可能感兴趣的:(joyful_pandas)