创建时间索引的Series
通过datetime的list创建Series,
import pandas as pd
from pandas import Series, DataFrame
from datetime import datetime
date_list = [
datetime(2015,9,1),
datetime(2015,9,10),
datetime(2016,10,10),
datetime(2016,10,12),
datetime(2017,10,12)]
s1 = Series(np.random.randn(5),index=date_list)
print(s1)
2019-01-01 0.579559
2019-01-02 0.189730
2019-01-03 -0.749135
2019-01-04 0.599295
2019-01-05 -1.029085
dtype: float64
s1.index
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05'],
dtype='datetime64[ns]', freq=None)
pandas 会将datetime的数组存储在DatetimeIndex中
s1.index[0]
Timestamp('2019-01-01 00:00:00')
pandas将datetime类型转化为了pandas中的pandas._libs.tslibs.timestamps.Timestamp类型 存储在了DatetimeIndex中
索引时间Series
pandas中时间索引的Series的索引方式
- 基于标签索引
t1 = s1.index[0]
s1[t1]
0.579559302102843
- 基于日期字符换索引
s1['20190101']
s1['2019-01-01']
s1['2019/01/05']
以上的方式都可以获取正确的value值,证明pandas内部有日期格式自动匹配模式。
- 基于年份和月份进行数据切片
long_ts = pd.Series(np.random.randn(15),pd.date_range('20181225',periods=15))
2018-12-25 -0.182188
2018-12-26 -0.824226
2018-12-27 0.553895
2018-12-28 -1.028436
2018-12-29 -0.352218
2018-12-30 -1.419503
2018-12-31 0.452379
2019-01-01 0.130104
2019-01-02 1.411735
2019-01-03 -0.177678
2019-01-04 -1.426672
2019-01-05 -1.015171
2019-01-06 -1.965249
2019-01-07 -1.066869
2019-01-08 1.133833
Freq: D, dtype: float64
基于年份索引
long_ts['2018']
基于月份索引
long_ts['2018-12']
- 使用datetime对Series进行切片
long_ts[datetime(2019,1,1):datetime(2019,1,5)]
2019-01-01 0.130104
2019-01-02 1.411735
2019-01-03 -0.177678
2019-01-04 -1.426672
2019-01-05 -1.015171
Freq: D, dtype: float64
- 基于字符串范围切片
long_ts['20190102':'20190104']
long_ts['2019-01-02':'2019-01-04']
- trruncate 切片函数
long_ts.truncate(before='20190101',after='20190105')
注意:before为开始时间,after为结束时间。为闭区间切片,既包含before和after本身
2019-01-01 0.130104
2019-01-02 1.411735
2019-01-03 -0.177678
2019-01-04 -1.426672
2019-01-05 -1.015171
Freq: D, dtype: float64
生成范围日期
pd中的date_range函数可以生成指定范围的DatetimeIndex对象
pd.date_range(start='20120401','20120601')
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
'2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
......
'2012-05-31', '2012-06-01'],
dtype='datetime64[ns]', freq='D')
如果只指定了一个start或end时间,可以通过periods设置日期的数量
pd.date_range(start='20120401',periods=20)
频率设定:默认date_range 会生成范围内的所有自然日的日期,可以通过freq设置范围内日期的选择方式,
如选择工作日 freq = 'B' ,每个月的最后一个工作日'BM'
pd.date_range(start='20190101',end='20191231',freq='BM')
DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-29', '2019-04-30',
'2019-05-31', '2019-06-28', '2019-07-31', '2019-08-30',
'2019-09-30', '2019-10-31', '2019-11-29', '2019-12-31'],
dtype='datetime64[ns]', freq='BM')
更多频率设置
别名 偏移量类型 说明
D Day 每日历日
B BusinessDay 每工作日
H Hour 每小时
T/min Minute 每分
S Second 每秒
L/ms Million 每毫秒
U Micro 每微妙
M MonthEnd 每月最后一个日历日
BM BusinessMonthEnd 每月最后一个工作日
MS MonthBegin 每月第一个日历日
BMS BusinessMonthBegin 每月第一个工作日
W-MON、W-TUE… Week 从指定的星期几开始算起,每周
WOM-1MON、WOM-2MON… WeekOfMonth 产生每月第一、二、三、四周的星期几,例如WOM-1MON表示每月的第一个星期一
Q-JAN、Q-FEB… QuarterEnd 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个日历日
BQ-JAN、BQ-FEB… BusinessQuarterEnd 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的最后一个工作日
QS-JAN、QS-FEB… QuarterBegin 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个日历日
BQS-JAN、BQS-FEB… BusinessQuarterBegin 对于以指定月份(JAN、FEB、…、DEC)结束的年度,每季度的最后一月的第一个工作日
A-JAN、A-FEB… YearEnd 每年指定月份最后一个日历日
BA-JAN、BA-FEB… BusinessYearEnd 每年指定月份最后一个工作日
AS-JAN、AS-FEB… YearBegin 每月指定月份第一个日历日
BAS-JAN、BAS-FEB… BusinessYearBegin 每月指定月份第一个工作日
normalize 将时间格式化为0点
pd.date_range(start='20190101 5:12',periods=5,normalize=False)
DatetimeIndex(['2019-01-01 05:12:00', '2019-01-02 05:12:00',
'2019-01-03 05:12:00', '2019-01-04 05:12:00',
'2019-01-05 05:12:00'],
dtype='datetime64[ns]', freq='D')
pd.date_range(start='20190101 5:12',periods=5,normalize=True)
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05'],
dtype='datetime64[ns]', freq='D')
组合频率
pandas中的频率是由基础频率和倍数组成的,基础频率通常为字符串别名,如M代表月份,H代表小时。一个基础频率加一个数字就可以组成倍数。如4H 代表4个小时。
pd.date_range(start='20190101',end='20190102',freq='4H')
DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 04:00:00',
'2019-01-01 08:00:00', '2019-01-01 12:00:00',
'2019-01-01 16:00:00', '2019-01-01 20:00:00',
'2019-01-02 00:00:00'],
dtype='datetime64[ns]', freq='4H')
频率的组合。pandas支持将多个基础频率组合成一个符合频率如4h30min组合。
pd.date_range(start='20190101',end='20190102',freq='4H30min')
DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 04:30:00',
'2019-01-01 09:00:00', '2019-01-01 13:30:00',
'2019-01-01 18:00:00', '2019-01-01 22:30:00'],
dtype='datetime64[ns]', freq='270T')
月中某个星期的日期。如每个月的第三个周五。
pd.date_range(start='20190101',periods=4,freq='WOM-3FRI')
DatetimeIndex(['2019-01-18', '2019-02-15', '2019-03-15', '2019-04-19'], dtype='datetime64[ns]', freq='WOM-3FRI')
shift将Series中的value值丢弃掉
ts = pd.Series(np.random.randn(4),index=pd.date_range('20190101',freq='M',periods=4))
ts.shift(1) # 正数表示从开始位置开始丢弃
2019-01-31 NaN
2019-02-28 -0.320870
2019-03-31 -1.419781
2019-04-30 1.550905
Freq: M, dtype: float64
ts.shift(-2) #负数表示从结束位置开始丢弃
2019-01-31 1.550905
2019-02-28 0.373627
2019-03-31 NaN
2019-04-30 NaN
Freq: M, dtype: float64
shift重新生成index,value值不变。
ts.shift(2,freq='m')
2019-03-31 -0.320870
2019-04-30 -1.419781
2019-05-31 1.550905
2019-06-30 0.373627
Freq: M, dtype: float64
日期偏移offset
pandas日期偏移可以通过datetime或者Timestamp设置
from pandas.tseries.offsets import Day,MonthEnd
now = datetime(2019,1,1)
now +3*Day()
now+Day(3)
Timestamp('2019-01-04 00:00:00')
now+2*MonthEnd()
now+MonthEnd(2)
Timestamp('2019-02-28 00:00:00')
也可以使用rollback 或者rollforward向前或向后滚动
offset = MonthEnd()
offset.rollback(now)
Timestamp('2018-12-31 00:00:00')
offset.rollforward(now)
Timestamp('2019-01-31 00:00:00')
offset与groupby结合使用
ts = pd.Series(np.random.randn(15),index = pd.date_range(start='20190115',periods=15,freq='4d'))
2019-01-15 2.108529
2019-01-19 0.856846
2019-01-23 -1.493254
...
2019-02-28 -0.592692
2019-03-04 1.733922
2019-03-08 -1.543377
2019-03-12 0.048729
Freq: 4D, dtype: float64
ts.groupby(offset.rollforward).mean() #等价与ts.resample('M').mean()
2019-01-31 0.813817
2019-02-28 -0.563597
2019-03-31 0.079758
dtype: float64