python时间日期函数与利用pandas进行时间序列处理详解
python标准库包含于日期(date)和时间(time)数据的数据类型,datetime、time以及calendar模块会被经常用到。
datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差。
下面我们先简单的了解下python日期和时间数据类型及工具
给datetime对象加上或减去一个或多个timedelta,会产生一个新的对象
fromdatetimeimportdatetime fromdatetimeimporttimedelta now=datetime.now() now datetime.datetime(2017,6,27,15,56,56,167000) datetime参数:datetime(year,month,day[,hour[,minute[,second[,microsecond[,tzinfo]]]]]) delta=now-datetime(2017,6,27,10,10,10,10) delta datetime.timedelta(0,20806,166990) delta.days 0 delta.seconds 20806 delta.microseconds 166990
datetime模块中的数据类型
类型 | 说明 |
---|---|
date | 以公历形式存储日历日期(年、月、日) |
time | 将时间存储为时、分、秒、毫秒 |
datetime | 存储日期和时间 |
timedelta | 表示两个datetime值之间的差(日、秒、毫秒) |
字符串和datetime的相互转换
1)python标准库函数
日期转换成字符串:利用str或strftime
字符串转换成日期:datetime.strptime
stamp=datetime(2017,6,27) str(stamp) '2017-06-2700:00:00' stamp.strftime('%y-%m-%d')#%Y是4位年,%y是2位年 '17-06-27' #对多个时间进行解析成字符串 date=['2017-6-26','2017-6-27'] datetime2=[datetime.strptime(x,'%Y-%m-%d')forxindate] datetime2 [datetime.datetime(2017,6,26,0,0),datetime.datetime(2017,6,27,0,0)]
2)第三方库dateutil.parser的时间解析函数
fromdateutil.parserimportparse parse('2017-6-27') datetime.datetime(2017,6,27,0,0) parse('27/6/2017',dayfirst=True) datetime.datetime(2017,6,27,0,0)
3)pandas处理成组日期
pandas通常用于处理成组日期,不管这些日期是DataFrame的轴索引还是列,to_datetime方法可以解析多种不同的日期表示形式。
date ['2017-6-26','2017-6-27'] importpandasaspd pd.to_datetime(date) DatetimeIndex(['2017-06-26','2017-06-27'],dtype='datetime64[ns]',freq=None)
datetime格式定义
代码 | 说明 |
---|---|
%Y | 4位数的年 |
%y | 2位数的年 |
%m | 2位数的月[01,12] |
%d | 2位数的日[01,31] |
%H | 时(24小时制)[00,23] |
%l | 时(12小时制)[01,12] |
%M | 2位数的分[00,59] |
%S | 秒[00,61]有闰秒的存在 |
%w | 用整数表示的星期几[0(星期天),6] |
%F | %Y-%m-%d简写形式例如,2017-06-27 |
%D | %m/%d/%y简写形式 |
pandas时间序列基础以及时间、日期处理
pandas最基本的时间序列类型就是以时间戳(时间点)(通常以python字符串或datetime对象表示)为索引的Series:
dates=['2017-06-20','2017-06-21',\ '2017-06-22','2017-06-23','2017-06-24','2017-06-25','2017-06-26','2017-06-27'] importnumpyasnp ts=pd.Series(np.random.randn(8),index=pd.to_datetime(dates)) ts 2017-06-200.788811 2017-06-210.372555 2017-06-220.009967 2017-06-23-1.024626 2017-06-240.981214 2017-06-250.314127 2017-06-26-0.127258 2017-06-271.919773 dtype:float64 ts.index DatetimeIndex(['2017-06-20','2017-06-21','2017-06-22','2017-06-23', '2017-06-24','2017-06-25','2017-06-26','2017-06-27'], dtype='datetime64[ns]',freq=None)
pandas不同索引的时间序列之间的算术运算会自动按日期对齐
ts[::2]#从前往后每隔两个取数据 2017-06-200.788811 2017-06-220.009967 2017-06-240.981214 2017-06-26-0.127258 dtype:float64 ts[::-2]#从后往前逆序每隔两个取数据 2017-06-271.919773 2017-06-250.314127 2017-06-23-1.024626 2017-06-210.372555 dtype:float64 ts+ts[::2]#自动数据对齐 2017-06-201.577621 2017-06-21NaN 2017-06-220.019935 2017-06-23NaN 2017-06-241.962429 2017-06-25NaN 2017-06-26-0.254516 2017-06-27NaN dtype:float64
索引为日期的Series和DataFrame数据的索引、选取以及子集构造
方法:
1).index[number_int]
2)[一个可以被解析为日期的字符串]
3)对于,较长的时间序列,只需传入‘年'或‘年月'可返回对应的数据切片
4)通过时间范围进行切片索引
ts 2017-06-200.788811 2017-06-210.372555 2017-06-220.009967 2017-06-23-1.024626 2017-06-240.981214 2017-06-250.314127 2017-06-26-0.127258 2017-06-271.919773 dtype:float64 ts[ts.index[2]] 0.0099673896063391908 ts['2017-06-21']#传入可以被解析成日期的字符串 0.37255538918121028 ts['21/06/2017'] 0.37255538918121028 ts['20170621'] 0.37255538918121028 ts['2017-06']#传入年或年月 2017-06-200.788811 2017-06-210.372555 2017-06-220.009967 2017-06-23-1.024626 2017-06-240.981214 2017-06-250.314127 2017-06-26-0.127258 2017-06-271.919773 dtype:float64 ts['2017-06-20':'2017-06-23']#时间范围进行切片 2017-06-200.788811 2017-06-210.372555 2017-06-220.009967 2017-06-23-1.024626 dtype:float64
带有重复索引的时间序列
1).index.is_unique检查索引日期是否是唯一的
2)对非唯一时间戳的数据进行聚合,通过groupby,并传入level=0(索引的唯一一层)
dates=pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03']) dates DatetimeIndex(['2017-06-01','2017-06-02','2017-06-02','2017-06-02', '2017-06-03'], dtype='datetime64[ns]',freq=None) dup_ts=pd.Series(np.arange(5),index=dates) dup_ts 2017-06-010 2017-06-021 2017-06-022 2017-06-023 2017-06-034 dtype:int32 dup_ts.index.is_unique False dup_ts['2017-06-02'] 2017-06-021 2017-06-022 2017-06-023 dtype:int32 grouped=dup_ts.groupby(level=0).mean() grouped 2017-06-010 2017-06-022 2017-06-034 dtype:int32 dup_df=pd.DataFrame(np.arange(10).reshape((5,2)),index=dates) dup_df
0
1
2017-06-01
0
1
2017-06-02
2
3
2017-06-02
4
5
2017-06-02
6
7
2017-06-03
8
9
grouped_df=dup_df.groupby(level=0).mean()##针对DataFrame grouped_df
0
1
2017-06-01
0
1
2017-06-02
4
5
2017-06-03
8
9
本文总结了以下4个知识点
1)字符串、日期的转换方法
2)日期和时间的主要python,datetime、timedelta、pandas.to_datetime等
3)以时间为索引的Series和DataFrame的索引、切片
4)带有重复时间索引时的索引,.groupby(level=0)应用