python Pandas库基础分析之时间序列的处理详解
前言
在使用Python进行数据分析时,经常会遇到时间日期格式处理和转换,特别是分析和挖掘与时间相关的数据,比如量化交易就是从历史数据中寻找股价的变化规律。Python中自带的处理时间的模块有datetime,NumPy库也提供了相应的方法,Pandas作为Python环境下的数据分析库,更是提供了强大的日期数据处理的功能,是处理时间序列的利器。
1、生成日期序列
主要提供pd.data_range()和pd.period_range()两个方法,给定参数有起始时间、结束时间、生成时期的数目及时间频率(freq='M'月,'D'天,‘W',周,'Y'年)等。
两种主要区别在于pd.date_range()生成的是DatetimeIndex格式的日期序列;pd.period_range()生成的是PeriodIndex格式的日期序列。
以下通过生成月时间序列和周时间序列来对比下:
date_rng=pd.date_range('2019-01-01',freq='M',periods=12) print(f'monthdate_range(): {date_rng}') """ date_range(): DatetimeIndex(['2019-01-31','2019-02-28','2019-03-31','2019-04-30', '2019-05-31','2019-06-30','2019-07-31','2019-08-31', '2019-09-30','2019-10-31','2019-11-30','2019-12-31'], dtype='datetime64[ns]',freq='M') """ period_rng=pd.period_range('2019/01/01',freq='M',periods=12) print(f'monthperiod_range(): {period_rng}') """ period_range(): PeriodIndex(['2019-01','2019-02','2019-03','2019-04','2019-05','2019-06', '2019-07','2019-08','2019-09','2019-10','2019-11','2019-12'], dtype='period[M]',freq='M') """ date_rng=pd.date_range('2019-01-01',freq='W-SUN',periods=12) print(f'weekdate_range(): {date_rng}') """ weekdate_range(): DatetimeIndex(['2019-01-06','2019-01-13','2019-01-20','2019-01-27', '2019-02-03','2019-02-10','2019-02-17','2019-02-24', '2019-03-03','2019-03-10','2019-03-17','2019-03-24'], dtype='datetime64[ns]',freq='W-SUN') """ period_rng=pd.period_range('2019-01-01',freq='W-SUN',periods=12) print(f'weekperiod_range(): {period_rng}') """ weekperiod_range(): PeriodIndex(['2018-12-31/2019-01-06','2019-01-07/2019-01-13', '2019-01-14/2019-01-20','2019-01-21/2019-01-27', '2019-01-28/2019-02-03','2019-02-04/2019-02-10', '2019-02-11/2019-02-17','2019-02-18/2019-02-24', '2019-02-25/2019-03-03','2019-03-04/2019-03-10', '2019-03-11/2019-03-17','2019-03-18/2019-03-24'], dtype='period[W-SUN]',freq='W-SUN') """ date_rng=pd.date_range('2019-01-0100:00:00',freq='H',periods=12) print(f'hourdate_range(): {date_rng}') """ hourdate_range(): DatetimeIndex(['2019-01-0100:00:00','2019-01-0101:00:00', '2019-01-0102:00:00','2019-01-0103:00:00', '2019-01-0104:00:00','2019-01-0105:00:00', '2019-01-0106:00:00','2019-01-0107:00:00', '2019-01-0108:00:00','2019-01-0109:00:00', '2019-01-0110:00:00','2019-01-0111:00:00'], dtype='datetime64[ns]',freq='H') """ period_rng=pd.period_range('2019-01-0100:00:00',freq='H',periods=12) print(f'hourperiod_range(): {period_rng}') """ hourperiod_range(): PeriodIndex(['2019-01-0100:00','2019-01-0101:00','2019-01-0102:00', '2019-01-0103:00','2019-01-0104:00','2019-01-0105:00', '2019-01-0106:00','2019-01-0107:00','2019-01-0108:00', '2019-01-0109:00','2019-01-0110:00','2019-01-0111:00'], dtype='period[H]',freq='H') """
2、生成Timestamp对象及转换
创建一个Timestamp时间戳对象有pd.Timestamp()方法和pd.to_datetime()方法。如下所示:
ts=pd.Timestamp(2019,1,1) print(f'pd.Timestamp()-1:{ts}') #pd.Timestamp()-1:2019-01-0100:00:00 ts=pd.Timestamp(dt(2019,1,1,hour=0,minute=1,second=1)) print(f'pd.Timestamp()-2:{ts}') #pd.Timestamp()-2:2019-01-0100:01:01 ts=pd.Timestamp("2019-1-10:1:1") print(f'pd.Timestamp()-3:{ts}') #pd.Timestamp()-3:2019-01-0100:01:01 print(f'pd.Timestamp()-type:{type(ts)}') #pd.Timestamp()-type:#dt=pd.to_datetime(2019,1,1)不支持 dt=pd.to_datetime(dt(2019,1,1,hour=0,minute=1,second=1)) print(f'pd.to_datetime()-1:{dt}') #pd.to_datetime()-1:2019-01-0100:01:01 dt=pd.to_datetime("2019-1-10:1:1") print(f'pd.to_datetime()-2:{dt}') #pd.to_datetime()-2:2019-01-0100:01:01 print(f'pd.to_datetime()-type:{type(dt)}') #pd.to_datetime()-type: #pd.to_datetime生成自定义时间序列 dtlist=pd.to_datetime(["2019-1-10:1:1","2019-3-10:1:1"]) print(f'pd.to_datetime()-list:{dtlist}') #pd.to_datetime()-list:DatetimeIndex(['2019-01-0100:01:01','2019-03-0100:01:01'],dtype='datetime64[ns]',freq=None) #时间戳转换为period月时期 pr=ts.to_period('M') print(f'ts.to_period():{pr}') #ts.to_period():2019-01 print(f'pd.to_period()-type:{type(pr)}') #pd.to_period()-type:
3、生成period对象及转换
#定义时期period per=pd.Period('2019') print(f'pd.Period():{per}') #pd.Period():2019 per_del=pd.Period('2019')-pd.Period('2018') print(f'2019和2018间隔{per_del}年')#可以直接+、-整数(代表年) #2019和2018间隔1年 #时期转换为时间戳 print(per.to_timestamp(how='end'))#2019-12-3100:00:00 print(per.to_timestamp(how='start'))#2019-01-0100:00:00
4、生成时间间隔Timedelta
#生成时间间隔Timedelta print(pd.Timedelta(days=5,minutes=50,seconds=20,milliseconds=10,microseconds=10,nanoseconds=10)) #5days00:50:20.010010 #获取当前时间 now=pd.datetime.now() #计算当前时间往后50天的日期 dt=now+pd.Timedelta(days=50) print(f'当前时间是{now},50天后时间是{dt}') #当前时间是2019-06-0817:59:31.726065,50天后时间是2019-07-2817:59:31.726065 #只显示年月日 print(dt.strftime('%Y-%m-%d'))#2019-07-28
5、重采样及频率转换
#asfreq按季度显示索引值 #'DatetimeIndex'objecthasnoattribute'asfreq' date=pd.date_range('1/1/2018',periods=20,freq='D') tsdat_series=pd.Series(range(20),index=date) tsp_series=tsdat_series.to_period('D') print(tsp_series.index.asfreq('Q')) date=pd.period_range('1/1/2018',periods=20,freq='D') tsper_series=pd.Series(range(20),index=date) print(tsper_series.index.asfreq('Q')) """ PeriodIndex(['2018Q1','2018Q1','2018Q1','2018Q1','2018Q1','2018Q1', '2018Q1','2018Q1','2018Q1','2018Q1','2018Q1','2018Q1', '2018Q1','2018Q1','2018Q1','2018Q1','2018Q1','2018Q1', '2018Q1','2018Q1'], dtype='period[Q-DEC]',freq='Q-DEC') """ #resample按季度统计并显示 print(tsdat_series.resample('Q').sum().to_period('Q')) """ 2018Q1190 Freq:Q-DEC,dtype:int64 """ #groupby按周进行汇总求平均值 print(tsdat_series.groupby(lambdax:x.weekday).mean()) """ 07.0 18.0 29.0 310.0 411.0 512.0 69.5 dtype:float64 """
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。