import pandas as pd
import numpy as np
Pandas在时间点建立的输入格式规定上给了很大的自由度,下面的语句都能正确建立同一时间点
下面的语句都会报错
此时可利用format参数强制匹配
同时,使用列表可以将其转为时间点索引
对于DataFrame而言,如果列已经按照时间顺序排好,则利用to_datetime可自动转换
事实上,Timestamp的精度远远不止day,可以最小到纳秒ns
同时,它带来范围的代价就是只有大约584年的时间点是可用的
一般来说,start/end/periods(时间点个数)/freq(间隔方法)是该方法最重要的参数,给定了其中的3个,剩下的一个就会被确定
其中freq参数有许多选项,下面将常用部分罗列如下,更多选项可看这里
bdate_range是一个类似与date_range的方法,特点在于可以在自带的工作日间隔设置上,再选择weekmask参数和holidays参数
它的freq中有一个特殊的’C’/‘CBM’/'CBMS’选项,表示定制,需要联合weekmask参数和holidays参数使用
例如现在需要将工作日中的周一、周二、周五3天保留,并将部分holidays剔除
Timedelta绝对时间差的特点指无论是冬令时还是夏令时,增减1day都只计算24小时
DataOffset相对时间差指,无论一天是23\24\25小时,增减1day都与当天相同的时间保持一致
例如,英国当地时间 2020年03月29日,01:00:00 时钟向前调整 1 小时 变为 2020年03月29日,02:00:00,开始夏令时
这似乎有些令人头大,但只要把tz(time zone)去除就可以不用管它了,两者保持一致,除非要使用到时区变换
DateOffset的可选参数包括years/months/weeks/days/hours/minutes/seconds
利用apply函数
直接使用对象加减
定制offset,可以指定weekmask和holidays参数(思考为什么三个都是一个值)
这一部分几乎与第二章的规则完全一致
合法字符自动转换为时间点
采用dt对象可以轻松获得关于时间的信息
所谓重采样,就是指resample函数,它可以看做时序版本的groupby函数
采样组的迭代和groupby迭代完全类似,对于每一个组都可以分别做相应操作
下面主要介绍pandas中两类主要的窗口(window)函数:rolling/expanding
所谓rolling方法,就是规定一个窗口,它和groupby对象一样,本身不会进行操作,需要配合聚合函数才能计算结果
min_periods参数是指需要的非缺失数据点数量阀值
count/sum/mean/median/min/max/std/var/skew/kurt/quantile/cov/corr都是常用的聚合函数
使用apply聚合时,只需记住传入的是window大小的Series,输出的必须是标量即可,比如如下计算变异系数
可选closed=‘right’(默认)‘left’‘both’'neither’参数,决定端点的包含情况
普通的expanding函数等价与rolling(window=len(s),min_periods=1),是对序列的累计计算
apply方法也是同样可用的
cumsum/cumprod/cummax/cummin都是特殊expanding累计计算方法
shift/diff/pct_change都是涉及到了元素关系
①shift是指序列索引不变,但值向后移动
②diff是指前后元素的差,period参数表示间隔,默认为1,并且可以为负
③pct_change是值前后元素的变化百分比,period参数与diff类似
【问题一】 如何对date_range进行批量加帧操作或对某一时间段加大时间戳密度?
【问题二】 如何批量增加TimeStamp的精度?
【问题三】 对于超出处理时间的时间点,是否真的完全没有处理方法?
【问题四】 给定一组非连续的日期,怎么快速找出位于其最大日期和最小日期之间,且没有出现在该组日期中的日期?
【练习一】 现有一份关于某超市牛奶销售额的时间序列数据,请完成下列问题:
(a)销售额出现最大值的是星期几?(提示:利用dayofweek函数)
(b)计算除去春节、国庆、五一节假日的月度销售总额
(c)按季度计算周末(周六和周日)的销量总额
(d)从最后一天开始算起,跳过周六和周一,以5天为一个时间单位向前计算销售总和
(e)假设现在发现数据有误,所有同一周里的周一与周五的销售额记录颠倒了,请计算2018年中每月第一个周一的销售额(如果该周没有周一或周五的记录就保持不动)
【练习二】 继续使用上一题的数据,请完成下列问题:
(a)以50天为窗口计算滑窗均值和滑窗最大值(min_periods设为1)
(b)现在有如下规则:若当天销售额超过向前5天的均值,则记为1,否则记为0,请给出2018年相应的计算结果
(c)将©中的“向前5天”改为“向前非周末5天”,请再次计算结果