Pandas高级教程之:时间处理

作者&投稿:师崔 (若有异议请与网页底部的电邮联系)
~ 简介

时间应该是在数据处理中经常会用到的一种数据类型,除了Numpy中datetime64和timedelta64这两种数据类型之外,pandas还整合了其他python库比如scikits.timeseries中的功能。

时间分类

pandas中有四种时间类型:

Datetimes:日期和时间,可以带时区。和标准库中的datetime.datetime类似。

Timedeltas:绝对持续时间,和标准库中的datetime.timedelta类似。

Timespans:由时间点及其关联的频率定义的时间跨度。

Dateoffsets:基于日历计算的时间和dateutil.relativedelta.relativedelta类似。

我们用一张表来表示:

类型标量class数组classpandas数据类型主要创建方法DatetimesTimestampDatetimeIndexdatetime64[ns]ordatetime64[ns,tz]to_datetimeordate_rangeTimedeltasTimedeltaTimedeltaIndextimedelta64[ns]to_timedeltaortimedelta_rangeTimespansPeriodPeriodIndexperiod[freq]Periodorperiod_rangeDateoffsetsDateOffsetNoneNoneDateOffset

看一个使用的例子:

In[19]:pd.Series(range(3),index=pd.date_range("2000",freq="D",periods=3))Out[19]:2000-01-0102000-01-0212000-01-032Freq:D,dtype:int64

看一下上面数据类型的空值:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:FalseTimestamp

Timestamp是最基础的时间类型,我们可以这样创建:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')DatetimeIndex

Timestamp作为index会自动被转换为DatetimeIndex:

In[33]:dates=[....:pd.Timestamp("2012-05-01"),....:pd.Timestamp("2012-05-02"),....:pd.Timestamp("2012-05-03"),....:]....:In[34]:ts=pd.Series(np.random.randn(3),dates)In[35]:type(ts.index)Out[35]:pandas.core.indexes.datetimes.DatetimeIndexIn[36]:ts.indexOut[36]:DatetimeIndex(['2012-05-01','2012-05-02','2012-05-03'],dtype='datetime64[ns]',freq=None)In[37]:tsOut[37]:2012-05-010.4691122012-05-02-0.2828632012-05-03-1.509059dtype:float64date_range和bdate_range

还可以使用date_range来创建DatetimeIndex:

In[74]:start=datetime.datetime(2011,1,1)In[75]:end=datetime.datetime(2012,1,1)In[76]:index=pd.date_range(start,end)In[77]:indexOut[77]:DatetimeIndex(['2011-01-01','2011-01-02','2011-01-03','2011-01-04','2011-01-05','2011-01-06','2011-01-07','2011-01-08','2011-01-09','2011-01-10',...'2011-12-23','2011-12-24','2011-12-25','2011-12-26','2011-12-27','2011-12-28','2011-12-29','2011-12-30','2011-12-31','2012-01-01'],dtype='datetime64[ns]',length=366,freq='D')

date_range是日历范围,bdate_range是工作日范围:

In[78]:index=pd.bdate_range(start,end)In[79]:indexOut[79]:DatetimeIndex(['2011-01-03','2011-01-04','2011-01-05','2011-01-06','2011-01-07','2011-01-10','2011-01-11','2011-01-12','2011-01-13','2011-01-14',...'2011-12-19','2011-12-20','2011-12-21','2011-12-22','2011-12-23','2011-12-26','2011-12-27','2011-12-28','2011-12-29','2011-12-30'],dtype='datetime64[ns]',length=260,freq='B')

两个方法都可以带上start,end,和periods参数。

In[84]:pd.bdate_range(end=end,periods=20)In[83]:pd.date_range(start,end,freq="W")In[86]:pd.date_range("2018-01-01","2018-01-05",periods=5)origin

使用origin参数,可以修改DatetimeIndex的起点:

In[67]:pd.to_datetime([1,2,3],unit="D",origin=pd.Timestamp("1960-01-01"))Out[67]:DatetimeIndex(['1960-01-02','1960-01-03','1960-01-04'],dtype='datetime64[ns]',freq=None)

默认情况下origin='unix',也就是起点是1970-01-0100:00:00.

In[68]:pd.to_datetime([1,2,3],unit="D")Out[68]:DatetimeIndex(['1970-01-02','1970-01-03','1970-01-04'],dtype='datetime64[ns]',freq=None)格式化

使用format参数可以对时间进行格式化:

In[51]:pd.to_datetime("2010/11/12",format="%Y/%m/%d")Out[51]:Timestamp('2010-11-1200:00:00')In[52]:pd.to_datetime("12-11-201000:00",format="%d-%m-%Y%H:%M")Out[52]:Timestamp('2010-11-1200:00:00')Period

Period表示的是一个时间跨度,通常和freq一起使用:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False0

Period可以直接进行运算:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False1

注意,Period只有具有相同的freq才能进行算数运算。包括offsets和timedelta

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False2

Period作为index可以自动被转换为PeriodIndex:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False3

可以通过pd.period_range方法来创建PeriodIndex:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False4

还可以通过PeriodIndex直接创建:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False5DateOffset

DateOffset表示的是频率对象。它和Timedelta很类似,表示的是一个持续时间,但是有特殊的日历规则。比如Timedelta一天肯定是24小时,而在DateOffset中根据夏令时的不同,一天可能会有23,24或者25小时。

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False6

DateOffsets和Frequency运算是先关的,看一下可用的DateOffset和它相关联的Frequency:

DateOffsetFrequencyString描述DateOffsetNone通用的offset类BDayorBusinessDay'B'工作日CDayorCustomBusinessDay'C'自定义的工作日Week'W'一周WeekOfMonth'WOM'每个月的第几周的第几天LastWeekOfMonth'LWOM'每个月最后一周的第几天MonthEnd'M'日历月末MonthBegin'MS'日历月初BMonthEndorBusinessMonthEnd'BM'营业月底BMonthBeginorBusinessMonthBegin'BMS'营业月初CBMonthEndorCustomBusinessMonthEnd'CBM'自定义营业月底CBMonthBeginorCustomBusinessMonthBegin'CBMS'自定义营业月初SemiMonthEnd'SM'日历月末的第15天SemiMonthBegin'SMS'日历月初的第15天QuarterEnd'Q'日历季末QuarterBegin'QS'日历季初BQuarterEnd'BQ工作季末BQuarterBegin'BQS'工作季初FY5253Quarter'REQ'零售季(52-53week)YearEnd'A'日历年末YearBegin'AS'or'BYS'日历年初BYearEnd'BA'营业年末BYearBegin'BAS'营业年初FY5253'RE'零售年(aka52-53week)EasterNone复活节假期BusinessHour'BH'businesshourCustomBusinessHour'CBH'custombusinesshourDay'D'一天的绝对时间Hour'H'一小时Minute'T'or'min'一分钟Second'S'一秒钟Milli'L'or'ms'一微妙Micro'U'or'us'一毫秒Nano'N'一纳秒

DateOffset还有两个方法rollforward()和rollback()可以将时间进行移动:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False7

上面的操作会自动保存小时,分钟等信息,如果想要设置为00:00:00,可以调用normalize()方法:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False8作为index

时间可以作为index,并且作为index的时候会有一些很方便的特性。

可以直接使用时间来获取相应的数据:

In[24]:pd.Timestamp(pd.NaT)Out[24]:NaTIn[25]:pd.Timedelta(pd.NaT)Out[25]:NaTIn[26]:pd.Period(pd.NaT)Out[26]:NaT#Equalityactsasnp.nanwouldIn[27]:pd.NaT==pd.NaTOut[27]:False9

获取全年的数据:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')0

获取某个月的数据:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')1

DF可以接受时间作为loc的参数:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')2

时间切片:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')3切片和完全匹配

考虑下面的一个精度为分的Series对象:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')4

时间精度小于分的话,返回的是一个Series对象:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')5

时间精度大于分的话,返回的是一个常量:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')6

同样的,如果精度为秒的话,小于秒会返回一个对象,等于秒会返回常量值。

时间序列的操作Shifting

使用shift方法可以让timeseries进行相应的移动:

In[28]:pd.Timestamp(datetime.datetime(2012,5,1))Out[28]:Timestamp('2012-05-0100:00:00')In[29]:pd.Timestamp("2012-05-01")Out[29]:Timestamp('2012-05-0100:00:00')In[30]:pd.Timestamp(2012,5,1)Out[30]:Timestamp('2012-05-0100:00:00')7

通过指定freq,可以设置shift的方式:

In[28]:pd.Ti


Pandas高级教程之:时间处理
类型标量class数组classpandas数据类型主要创建方法DatetimesTimestampDatetimeIndexdatetime64[ns]ordatetime64[ns,tz]to_datetimeordate_rangeTimedeltasTimedeltaTimedeltaIndextimedelta64[ns]to_timedeltaortimedelta_rangeTimespansPeriodPeriodIndexperiod[freq]Periodorperiod_rangeDateoffsetsDateOffsetNoneNoneDateOffset 看一个...

Pandas最详细教程来了!
第一步:踏上Pandas之旅 首先,导入Pandas,就像这样:import pandas as pd,这将使我们能以pd的形式轻松使用Pandas的功能。数据容器:DataFrame DataFrame是Pandas的核心数据结构,它是一个二维表格,每列可以存储不同类型的值。它具备行索引和列标签,就像SQL的表格或Excel的工作表。实例代码:data={'A...

Pandas高级教程之:Dataframe的合并
默认按行(axis=0)连接,若需按列(axis=1)连接,只需调整axis值。join='outer'会填充缺失值,而join='inner'则只保留匹配的行。如果需要保留原始index,可以使用reindex或相应的方法。concat还可以合并DataFrame和Series,甚至在列名不一致的情况下自动处理。另一个简单而强大的合并工具是append,它沿...

pandas教程:[4]Dataframe筛选数据
首先我们创建一个DataFrame,该DataFrame包含的数据如下 假如我们想要筛选D列数据中大于0的行 使用符号可以实现多条件筛选,当然是用"|"符号也可以实现多条件,只不过他是或的关系。假如我们只需要A和B列数据,而D和C列数据都是用于筛选的,可以这样写:只返回了AB两列数据‘我们以上用到的方...

pandas 详细教程
首先,数据框(DataFrame)是pandas的核心数据结构,类似于由行列组成的表格。Series则是DataFrame的列,每个列可以看作是一维数组。构建数据框有多种方式:一,通过二维数组,确保元素类型一致,列名对应columns,行名对应indexes。二,使用字典构建,键是列名,值是列元素,不足的值用特定值填充。三,空...

Pandas教程 | 数据处理三板斧——map、apply、applymap详解
首先,map方法适用于Series,例如,如果你想将gender列中的'男'转换为1,'女'转换为0,使用map只需一行代码。map的工作原理是逐个将数据映射到字典或函数输出,无论使用函数还是字典,它都以输入数据作为参数获取映射结果。apply方法则更为灵活,它能接收复杂函数,如在统计过程中需要对age列进行动态调整...

pandas教程
不知道的小伙伴来看看小编今天的pandas教程分享吧!1、pandas简介:pandas是python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。2、pandas数据结构:pandas核心数据结构有两种,即一维的series和二维的dataframe,二者可以分别...

Pandas入门教程.PPT
帮助你更好地理解Pandas的独特优势。Pandas的高频函数如groupby、rank、sort_values、drop_duplicates、merge和concat,将在数据预处理、合并、去重和透视表的创建等方面大显身手。想要获取这份PPT,只需关注我们的【尤而小屋】,回复“熊猫”即可获取。希望这份教程能对你的Pandas学习之路提供帮助。

Python Pandas转换日期格式:将yyyy\/m\/d转换为yyyymmdd
day列,确保一位数前加0,实现格式统一,如图二所示。紧接着,将生成的year、month、day列合并为新列“trade_date”,确保格式为yyyymmdd。最后一步,仅保留所需的列,实现数据的精准提取,效果如图四所示。在实现此转换后,我推荐学习Python Pandas教程,掌握pandas工具能够轻松应对各种数据分析任务。

量化交易学习笔记#Python量化入门课程(第零课)零基础的预备课
作业建议预习《Python基础教程(第二版)》的前五章。课程大纲分为九课,每课分为上下两部分,每部分约30-40分钟。第一课涵盖量化投资基础、Python环境搭建等内容;第二课至第五课分别讲解Python基础、Pandas操作、择时策略和选股策略;第六课和第七课深入到策略评价;第八课涉及实盘交易,第九课探讨...

临澧县19821162218: 如何用pandas处理分钟数据变成小时线 -
任莎复胃: 自己写一个class定义小时线的内容字段 然后逐行读取tuple,记录下小时线的ohlc 判断时间满足条件就生成一条新的bar

临澧县19821162218: Python Pandas一个DataFrame中有多个时间序列如何处理? -
任莎复胃: 虽然不知道是想解决怎样的具体问题,但按照您的思路来看,有可能是通过多重条件判断来检索出数据.如果是的话,可以看一下我的方法:我来模拟一个问题,就是我想找出2016-10-02号离职的人当中,哪些人的入职日期是在2015-01-01和...

临澧县19821162218: 如何将pandas.dataframe的数据写入到文件中? -
任莎复胃: 步骤操作方法如下: 1、环境准备: a、右击桌面上选择【Open in Terminal】 打开终端. b、在弹出的终端中输入【ipython】进入Python的解释器中,如图1所示. 2、导入所需要的包: 导入实验常用的python包.如图2所示. 【import ...

临澧县19821162218: pandas怎么把时间间隔数据转化为整数 -
任莎复胃: 取长整数型十六进制文本 返回文本型 参数 长整数 长整数型 局部变量 返回值 文本型 长整数变量 长整数型 长整数变量=长整数 判断循环首(长整数变量>0) 返回值=取文本中间(“0123456789ABCDEF”,长整数变量%16+1,1)+返回值 长整数变量=长整数变量\16 判断循环尾() 返回(返回值) '通过反向取余实现

临澧县19821162218: python pandas怎么输出结果 -
任莎复胃: 本文是对pandas官方网站上《10 Minutes to pandas》的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上,我们会按下面格式引入所需要的包:一、 创建对象 可以通过 Data ...

临澧县19821162218: pandas datetime 怎么提取月份 -
任莎复胃: 首先,既然你要画残差(residual)的qqplot 那一定要先做回归. 你没说明回归自变量和因变量都是什么,假设第二列是因变量pressure[2],第三列是自变量pressure[3] 1.回归 >lm.fitqqnorm(lm.fit$res) >qqliine(lm.fit$res) 提取?

临澧县19821162218: 请问用python的pandas库如何实现计算某一个元素在另一个类别中出现的次数? -
任莎复胃: 如果用pivot_table,需要给df重复出一列data_type df['col']=df.data_type df.pivot_table(index='year',columns='col',values='data_type',aggfunc=pd.Series.value_counts) col 1 2 3 year 2006 4 4 42007 3 3 22008 3 3 4 用交叉表其实最方便:pd.crosstab(df.year,df.data_type) data_type 1 2 3 year 2006 4 4 42007 3 3 22008 3 3 4

临澧县19821162218: R和Python -
任莎复胃: Python与R的区别和联系 1、区别Python与R的区别是显而易见的,因为R是针对统计的,python是给程序员设计的.2012年R是学术界的主流,但是现在Python正在慢慢取代R在学术界的地位.Python与R相比速度要快.Python可以直接处理上...

临澧县19821162218: pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快 -
任莎复胃: 如果用for来遍历,pandas比普通的python程序还要慢.试试Series.apply函数来调用do_some_things_with_time,自然就得到了一个新的处理过的time列. df.time2=df.time.apply(do_some_things_with_time) 或者直接赋值给df.time也行

临澧县19821162218: 如何用python读取mysql的数据,再进行机器学习建模?转化为dateframe吗?然后咋处理 -
任莎复胃: pandas是python环境下最有名的数据统计包,而DataFrame翻译为数据框,是一种数据组织方式,这么说你可能无法从感性上认识它,举个例子,你大概用过Excel,而它也是一种数据组织和呈现的方式,简单说就是表格,而在在pandas中用...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网