首页 > 其他分享 >Pandas处理时序数据(初学者必会)!

Pandas处理时序数据(初学者必会)!

时间:2023-08-04 16:07:45浏览次数:38  
标签:00 01 时序 range 2020 初学者 pd datetime Pandas


 Datawhale干货 

作者:耿远昊,Datawhale成员,华东师范大学

时序数据是指时间序列数据。时间序列数据是同一统一指标按时间顺序记录的数据列。在同一数据列中的各个数据必须是同口径的,要求具有可比性。时序数据可以是时期数,也可以时点数。

时间序列分析的目的是通过找出样本内时间序列的统计特性和发展规律性,构建时间序列模型,进行样本外预测。

现在,一起来学习用Pandas处理时序数据。

Pandas处理时序数据(初学者必会)!_迭代

本文目录

    1. 时序的创建

        1.1. 四类时间变量

        1.2. 时间点的创建

        1.3. DataOffset对象

    2. 时序的索引及属性

        2.1. 索引切片

        2.2. 子集索引

        2.3. 时间点的属性

    3. 重采样

        3.1. resample对象的基本操作

        3.2. 采样聚合

        3.3. 采样组的迭代

    4. 窗口函数

        4.1. Rolling

        4.2. Expanding

    5. 问题及练习

        5.1. 问题

        5.2. 练习

import pandas as pd
import numpy as np

一、时序的创建

1.1. 四类时间变量

现在理解可能关于③和④有些困惑,后面会作出一些说明

Pandas处理时序数据(初学者必会)!_时间序列_02

1.2. 时间点的创建

(a)to_datetime方法

Pandas在时间点建立的输入格式规定上给了很大的自由度,下面的语句都能正确建立同一时间点

pd.to_datetime('2020.1.1')
pd.to_datetime('2020 1.1')
pd.to_datetime('2020 1 1')
pd.to_datetime('2020 1-1')
pd.to_datetime('2020-1 1')
pd.to_datetime('2020-1-1')
pd.to_datetime('2020/1/1')
pd.to_datetime('1.1.2020')
pd.to_datetime('1.1 2020')
pd.to_datetime('1 1 2020')
pd.to_datetime('1 1-2020')
pd.to_datetime('1-1 2020')
pd.to_datetime('1-1-2020')
pd.to_datetime('1/1/2020')
pd.to_datetime('20200101')
pd.to_datetime('2020.0101')
Timestamp('2020-01-01 00:00:00')

下面的语句都会报错

#pd.to_datetime('2020\\1\\1')
#pd.to_datetime('2020`1`1')
#pd.to_datetime('2020.1 1')
#pd.to_datetime('1 1.2020')

此时可利用format参数强制匹配

pd.to_datetime('2020\\1\\1',format='%Y\\%m\\%d')
pd.to_datetime('2020`1`1',format='%Y`%m`%d')
pd.to_datetime('2020.1 1',format='%Y.%m %d')
pd.to_datetime('1 1.2020',format='%d %m.%Y')
Timestamp('2020-01-01 00:00:00')

同时,使用列表可以将其转为时间点索引

pd.Series(range(2),index=pd.to_datetime(['2020/1/1','2020/1/2']))

Pandas处理时序数据(初学者必会)!_迭代_03

type(pd.to_datetime(['2020/1/1','2020/1/2']))
pandas.core.indexes.datetimes.DatetimeIndex

对于DataFrame而言,如果列已经按照时间顺序排好,则利用to_datetime可自动转换

df = pd.DataFrame({'year': [2020, 2020],'month': [1, 1], 'day': [1, 2]})
pd.to_datetime(df)

Pandas处理时序数据(初学者必会)!_时间序列_04

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

事实上,Timestamp的精度远远不止day,可以最小到纳秒ns

pd.to_datetime('2020/1/1 00:00:00.123456789')
Timestamp('2020-01-01 00:00:00.123456789')

同时,它带来范围的代价就是只有大约584年的时间点是可用的

pd.Timestamp.min
Timestamp('1677-09-21 00:12:43.145225')
pd.Timestamp.max
Timestamp('2262-04-11 23:47:16.854775807')

(c)date_range方法

一般来说,start/end/periods(时间点个数)/freq(间隔方法)是该方法最重要的参数,给定了其中的3个,剩下的一个就会被确定

pd.date_range(start='2020/1/1',end='2020/1/10',periods=3)

Pandas处理时序数据(初学者必会)!_时间序列_05

pd.date_range(start='2020/1/1',end='2020/1/10',freq='D')

Pandas处理时序数据(初学者必会)!_时间序列_06

pd.date_range(start='2020/1/1',periods=3,freq='D')

Pandas处理时序数据(初学者必会)!_时间序列_07

pd.date_range(end='2020/1/3',periods=3,freq='D')

Pandas处理时序数据(初学者必会)!_迭代_08

其中freq参数有许多选项,下面将常用部分罗列如下,更多选项可看这里

pd.date_range(start='2020/1/1',periods=3,freq='T')

Pandas处理时序数据(初学者必会)!_数据_09

pd.date_range(start='2020/1/1',periods=3,freq='M')

Pandas处理时序数据(初学者必会)!_数据_10

pd.date_range(start='2020/1/1',periods=3,freq='BYS')

Pandas处理时序数据(初学者必会)!_迭代_11

bdate_range是一个类似与date_range的方法,特点在于可以在自带的工作日间隔设置上,再选择weekmask参数和holidays参数

它的freq中有一个特殊的'C'/'CBM'/'CBMS'选项,表示定制,需要联合weekmask参数和holidays参数使用

例如现在需要将工作日中的周一、周二、周五3天保留,并将部分holidays剔除

weekmask = 'Mon Tue Fri'
holidays = [pd.Timestamp('2020/1/%s'%i) for i in range(7,13)]
#注意holidays
pd.bdate_range(start='2020-1-1',end='2020-1-15',freq='C',weekmask=weekmask,holidays=holidays)

Pandas处理时序数据(初学者必会)!_数据_12

1.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,开始夏令时

ts = pd.Timestamp('2020-3-29 01:00:00', tz='Europe/Helsinki')
ts + pd.Timedelta(days=1)
Timestamp('2020-03-30 02:00:00+0300', tz='Europe/Helsinki')
ts + pd.DateOffset(days=1)
Timestamp('2020-03-30 01:00:00+0300', tz='Europe/Helsinki')

这似乎有些令人头大,但只要把tz(time zone)去除就可以不用管它了,两者保持一致,除非要使用到时区变换

ts = pd.Timestamp('2020-3-29 01:00:00')
ts + pd.Timedelta(days=1)
Timestamp('2020-03-30 01:00:00')
ts + pd.DateOffset(days=1)
Timestamp('2020-03-30 01:00:00')

(b)增减一段时间

DateOffset的可选参数包括years/months/weeks/days/hours/minutes/seconds

pd.Timestamp('2020-01-01') + pd.DateOffset(minutes=20) - pd.DateOffset(weeks=2)
Timestamp('2019-12-18 00:20:00')

(c)各类常用offset对象

pd.Timestamp('2020-01-01') + pd.offsets.Week(2)
Timestamp('2020-01-15 00:00:00')
pd.Timestamp('2020-01-01') + pd.offsets.BQuarterBegin(1)
Timestamp('2020-03-02 00:00:00')

(d)序列的offset操作

利用apply函数

pd.Series(pd.offsets.BYearBegin(3).apply(i) for i in pd.date_range('20200101',periods=3,freq='Y'))

Pandas处理时序数据(初学者必会)!_数据_13

直接使用对象加减

pd.date_range('20200101',periods=3,freq='Y') + pd.offsets.BYearBegin(3)

Pandas处理时序数据(初学者必会)!_时间序列_14

定制offset,可以指定weekmask和holidays参数(思考为什么三个都是一个值)

pd.Series(pd.offsets.CDay(3,weekmask='Wed Fri',holidays='2020010').apply(i)
                                  for i in pd.date_range('20200105',periods=3,freq='D'))

Pandas处理时序数据(初学者必会)!_时间序列_15

二、时序的索引及属性

2.1. 索引切片

这一部分几乎与第二章的规则完全一致

rng = pd.date_range('2020','2021', freq='W')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts.head()

Pandas处理时序数据(初学者必会)!_迭代_16

ts['2020-01-26']
-0.47982974619679947

合法字符自动转换为时间点

ts['2020-01-26':'20200726'].head()

Pandas处理时序数据(初学者必会)!_数据_17

2.2. 子集索引

ts['2020-7'].head()

Pandas处理时序数据(初学者必会)!_迭代_18

支持混合形态索引

ts['2011-1':'20200726'].head()

Pandas处理时序数据(初学者必会)!_数据_19

2.3. 时间点的属性

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

pd.Series(ts.index).dt.week.head()

Pandas处理时序数据(初学者必会)!_迭代_20

pd.Series(ts.index).dt.day.head()

Pandas处理时序数据(初学者必会)!_数据_21

利用strftime可重新修改时间格式

pd.Series(ts.index).dt.strftime('%Y-间隔1-%m-间隔2-%d').head()

Pandas处理时序数据(初学者必会)!_时间序列_22

对于datetime对象可以直接通过属性获取信息

pd.date_range('2020','2021', freq='W').month

Pandas处理时序数据(初学者必会)!_数据_23

pd.date_range('2020','2021', freq='W').weekday

Pandas处理时序数据(初学者必会)!_数据_24

三、重采样

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

3.1. resample对象的基本操作

采样频率一般设置为上面提到的offset字符

df_r = pd.DataFrame(np.random.randn(1000, 3),index=pd.date_range('1/1/2020', freq='S', periods=1000),
                  columns=['A', 'B', 'C'])
r = df_r.resample('3min')
r

Pandas处理时序数据(初学者必会)!_时间序列_25

r.sum()

Pandas处理时序数据(初学者必会)!_迭代_26

df_r2 = pd.DataFrame(np.random.randn(200, 3),index=pd.date_range('1/1/2020', freq='D', periods=200),
                  columns=['A', 'B', 'C'])
r = df_r2.resample('CBMS')
r.sum()

Pandas处理时序数据(初学者必会)!_迭代_27

3.2. 采样聚合

r = df_r.resample('3T')
r['A'].mean()

Pandas处理时序数据(初学者必会)!_数据_28

r['A'].agg([np.sum, np.mean, np.std])

Pandas处理时序数据(初学者必会)!_迭代_29

类似地,可以使用函数lambda表达式

r.agg({'A': np.sum,'B': lambda x: max(x)-min(x)})

Pandas处理时序数据(初学者必会)!_时间序列_30

3.3. 采样组的迭代

采样组的迭代和groupby迭代完全类似,对于每一个组都可以分别做相应操作

small = pd.Series(range(6),index=pd.to_datetime(['2020-01-01 00:00:00', '2020-01-01 00:30:00'
                                                 , '2020-01-01 00:31:00','2020-01-01 01:00:00'
                                                 ,'2020-01-01 03:00:00','2020-01-01 03:05:00']))
resampled = small.resample('H')
for name, group in resampled:
    print("Group: ", name)
    print("-" * 27)
    print(group, end="\n\n")

Pandas处理时序数据(初学者必会)!_时间序列_31

四、窗口函数

下面主要介绍pandas中两类主要的窗口(window)函数:rolling/expanding

s = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2020', periods=1000))
s.head()

Pandas处理时序数据(初学者必会)!_数据_32

4.1. Rolling

(a)常用聚合

所谓rolling方法,就是规定一个窗口,它和groupby对象一样,本身不会进行操作,需要配合聚合函数才能计算结果

s.rolling(window=50)
Rolling [window=50,center=False,axis=0]
s.rolling(window=50).mean()

Pandas处理时序数据(初学者必会)!_时间序列_33

min_periods参数是指需要的非缺失数据点数量阀值

s.rolling(window=50,min_periods=3).mean().head()

Pandas处理时序数据(初学者必会)!_时间序列_34

count/sum/mean/median/min/max/std/var/skew/kurt/quantile/cov/corr都是常用的聚合函数。

(b)rolling的apply聚合

使用apply聚合时,只需记住传入的是window大小的Series,输出的必须是标量即可,比如如下计算变异系数

s.rolling(window=50,min_periods=3).apply(lambda x:x.std()/x.mean()).head()

Pandas处理时序数据(初学者必会)!_数据_35

(c)基于时间的rolling

s.rolling('15D').mean().head()

Pandas处理时序数据(初学者必会)!_数据_36

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

s.rolling('15D', closed='right').sum().head()

Pandas处理时序数据(初学者必会)!_迭代_37

4.2. Expanding

(a)expanding函数

普通的expanding函数等价与rolling(window=len(s),min_periods=1),是对序列的累计计算

s.rolling(window=len(s),min_periods=1).sum().head()

Pandas处理时序数据(初学者必会)!_迭代_38

s.expanding().sum().head()

Pandas处理时序数据(初学者必会)!_数据_39

apply方法也是同样可用的

s.expanding().apply(lambda x:sum(x)).head()

Pandas处理时序数据(初学者必会)!_时间序列_40

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

cumsum/cumprod/cummax/cummin都是特殊expanding累计计算方法

s.cumsum().head()

Pandas处理时序数据(初学者必会)!_迭代_41

s.cumsum().head()

Pandas处理时序数据(初学者必会)!_时间序列_42

shift/diff/pct_change都是涉及到了元素关系

① shift是指序列索引不变,但值向后移动

② diff是指前后元素的差,period参数表示间隔,默认为1,并且可以为负

③ pct_change是值前后元素的变化百分比,period参数与diff类似

s.shift(2).head()

Pandas处理时序数据(初学者必会)!_数据_43

s.diff(3).head()

Pandas处理时序数据(初学者必会)!_时间序列_44

s.pct_change(3).head()

Pandas处理时序数据(初学者必会)!_迭代_45

五、问题与练习

5.1. 问题

【问题一】 如何对date_range进行批量加帧操作或对某一时间段加大时间戳密度?

Pandas处理时序数据(初学者必会)!_数据_46

【问题二】 如何批量增加TimeStamp的精度?


【问题三】 对于超出处理时间的时间点,是否真的完全没有处理方法?

Pandas处理时序数据(初学者必会)!_数据_47

【问题四】 给定一组非连续的日期,怎么快速找出位于其最大日期和最小日期之间,且没有出现在该组日期中的日期?

Pandas处理时序数据(初学者必会)!_时间序列_48

5.2. 练习

【练习一】 现有一份关于某超市牛奶销售额的时间序列数据,请完成下列问题:

Pandas处理时序数据(初学者必会)!_时间序列_49

Pandas处理时序数据(初学者必会)!_迭代_50

(a)销售额出现最大值的是星期几?(提示:利用dayofweek函数)

Pandas处理时序数据(初学者必会)!_迭代_51

(b)计算除去春节、国庆、五一节假日的月度销售总额

Pandas处理时序数据(初学者必会)!_数据_52

(c)按季度计算周末(周六和周日)的销量总额

Pandas处理时序数据(初学者必会)!_迭代_53

Pandas处理时序数据(初学者必会)!_时间序列_54

(d)从最后一天开始算起,跳过周六和周一,以5天为一个时间单位向前计算销售总和

Pandas处理时序数据(初学者必会)!_数据_55

Pandas处理时序数据(初学者必会)!_时间序列_56

(e)假设现在发现数据有误,所有同一周里的周一与周五的销售额记录颠倒了,请计算2018年中每月第一个周一的销售额(如果该周没有周一或周五的记录就保持不动)

Pandas处理时序数据(初学者必会)!_迭代_57


【练习二】 继续使用上一题的数据,请完成下列问题:

(a)以50天为窗口计算滑窗均值和滑窗最大值(min_periods设为1)

Pandas处理时序数据(初学者必会)!_时间序列_58

(b)现在有如下规则:若当天销售额超过向前5天的均值,则记为1,否则记为0,请给出2018年相应的计算结果

Pandas处理时序数据(初学者必会)!_时间序列_59

(c)将(c)中的“向前5天”改为“向前非周末5天”,请再次计算结果

Pandas处理时序数据(初学者必会)!_数据_60

本文电子版 后台回复 时序数据 获取

Pandas处理时序数据(初学者必会)!_迭代_61

标签:00,01,时序,range,2020,初学者,pd,datetime,Pandas
From: https://blog.51cto.com/u_15699042/6963569

相关文章

  • 第四届工业大数据赛事:时序序列预测 + 结构化数据挖掘2种类型赛题!
     Datawhale推荐 主办单位:中国信息通信研究院,国家电网,富士康等自2017年以来,由中国信通院主办的工业大数据创新竞赛已经成功举办三届。这是首个由政府主管部门指导的工业大数据领域的全国性权威赛事。除了权威单位的出力,许多业界知名互联网企业也贡献了宝贵的经验和数据,为参赛者......
  • 数据分析之Pandas缺失数据处理
     Datawhale干货 作者:耿远昊,Datawhale成员,华东师范大学Pandas是一个强大的分析结构化数据的工具集,它的使用基础是Numpy(提供高性能的矩阵运算),用于数据挖掘和数据分析,同时也提供数据清洗功能。在往期文章中,已经详细讲解了Pandas做分析数据的四种基本操作:索引、分组、变形及合并。现......
  • 盘点一个初学者Python库安装的问题(Mac系统)(下篇
    大家好,我是皮皮。一、前言前几天在Python私教群【Emma】问了一个Python库安装的基础问题,一起来看看吧。上一篇文章讲到【Emma】的远程环境不给力,需要继续本地指导。二、实现过程针对导包失败的问题,这里【狂吃山楂片】给了一个解决方法,如下图所示:右下角可以设置环境,你点一下,......
  • Chat GPT是什么,初学者使用Chat GPT,需要注意些什么
    ChatGPT是什么ChatGPT是由OpenAI开发的一种大型语言模型,它基于GPT(GenerativePre-trainedTransformer)架构。GPT是一种基于深度学习的预训练模型,通过在大规模文本数据上进行训练,学习了语言的统计规律和语义信息。ChatGPT专注于对话式交互,它可以接收用户的输入,并生成相应的回复......
  • [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
    MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据,并从中提取有关行为、模式和趋势的见解。无论是处......
  • 【pandas小技巧】--拆分列
    拆分列是pandas中常用的一种数据操作,它可以将一个包含多个值的列按照指定的规则拆分成多个新列,方便进行后续的分析和处理。拆分列的使用场景比较广泛,以下是一些常见的应用场景:处理日期数据:在日期数据中,经常会将年、月、日等信息合并成一列,通过拆分列可以将其拆分成多个新列,方便......
  • pandas模块------------------------筛选条件loc(多条件选择)
    loc在选择时应用条件。单条件:选择大于90成绩的学生信息:importpandasaspdsource=pd.read_excel('C:/Users/Administrator/Desktop/source.xlsx')print(source)da=source.loc[(source['成绩']>90)]print(da)G:\Python3.8解释器\python.exeC:/Users/Administrator/P......
  • pandas模块--------------------------------相同(不同)文件夹下相同格式的Excel表格数
    上代码:importpandasaspdimportos#文件路径file_dir=r'C:/Users/Administrator/Desktop/test/'#构建新的表格名称new_filename=file_dir+'/new_file.xlsx'#找到文件路径下的所有表格名称,返回列表file_list=os.listdir(file_dir)new_list=[]forfileinfile_list:......
  • 为企业提供更丰富可视化方案,时序数据库 TDengine 与帆软展开合作
    帆软作为中国专业的大数据BI和分析平台提供商,基于自研商业智能产品已成功服务了包括中信银行、兴业证券、天弘基金等在内的众多金融机构,2022年帆软《统一数据分析平台解决方案》成功斩获金融信创生态实验室优秀奖,这也是国内唯一一个获此殊荣的BI厂商。 随着TDengine在......
  • 【pandas小技巧】--修改列的名称
    重命名pandas数据中列的名称是一种常见的数据预处理任务。这通常是因为原始数据中的列名称可能不够清晰或准确。例如,列名可能包含空格、大写字母、特殊字符或拼写错误。使用pandas的rename函数可以帮助我们更改列名,从而使数据更加清晰和易于理解。此外,重命名列名还可以确保......