1.时期的频率转换
Period和PeriodIndex对象都可以通过其asfreq方法被转换成别的频率。假设我们有一个年度时期,希望将其转换为当年年初或年末的一个月度时期
p=pd.Period('2007',freq='A-DEC')
print p.asfreq('M',how='start')
print p.asfreq('M',how='end')
结果为:
2007-01
2007-12
你可以将Period('2007',freq='A-DEC')看做一个被划分为多个月度时期的时间段中的游标。对于一个不以12月结束的财政年变,月度子时期的归属情况就不一样了
p=pd.Period('2007',freq='A-JUN')
print p.asfreq('M','start')
print p.asfreq('M','end')
结果为:
2006-07
2007-06
在将高频率转换为低频率时,超时期是由子时期所属的位置决定的。例如,在A-JUN频率中,月份2007年08月实际上是属于周期2008年的
p=pd.Period('2007-08','M')
print p.asfreq('A-JUN')
结果为:
2008
PeriodIndex或TimeSeries的频率转换方式也是如此
rng=pd.period_range('2006','2009',freq='A-DEC')
ts=Series(np.random.randn(len(rng)),index=rng)
print ts
结果为:
2006 0.802142
2007 -0.048446
2008 -1.459365
2009 -0.710186
Freq: A-DEC, dtype: float64
print ts.asfreq('M',how='start')
print ts.asfreq('B',how='end')
结果为:
2006-01 1.385962
2007-01 -0.293633
2008-01 -0.742163
2009-01 0.147614
Freq: M, dtype: float64
2006-12-29 1.385962
2007-12-31 -0.293633
2008-12-31 -0.742163
2009-12-31 0.147614
Freq: B, dtype: float64
2.按季度计算的时期频率
pandas支持12种可能的季度型频率,即Q-JAN到Q-DEC
p=pd.Period('2012Q4',freq='Q-JAN')
print p
结果为:
2012Q4
在以1月结束的财年中,2012Q4是从11月到1月(将其转换为日型频率就明白了),如下图
print p.asfreq('D','start')
print p.asfreq('D','end')
结果为:
2011-11-01
2012-01-31
因此,Period之间的算术运算会非常简单。例如,要获取该季度倒数第二个工作日下午4点的时间戳
p4pm=(p.asfreq('B','e')-1).asfreq('T','S')+16*60
print p4pm
print p4pm.to_timestamp()
结果为:
2012-01-30 16:00
2012-01-30 16:00:00
period_range还可用于生产季度型范围。
rng=pd.period_range('2011Q3','2012Q4',freq='Q-JAN')
ts=Series(np.arange(len(rng)),index=rng)
print ts
结果为:
2011Q3 0
2011Q4 1
2012Q1 2
2012Q2 3
2012Q3 4
2012Q4 5
Freq: Q-JAN, dtype: int32
new_rng=(rng.asfreq('B','e')-1).asfreq('T','S')+16*60
ts.index=new_rng.to_timestamp()
print ts
结果为:
2010-10-28 16:00:00 0
2011-01-28 16:00:00 1
2011-04-28 16:00:00 2
2011-07-28 16:00:00 3
2011-10-28 16:00:00 4
2012-01-30 16:00:00 5
dtype: int32
3.将Timestamp转换为Period(及其反向过程)
通过使用to_period方法,可以将由时间戳索引的Series和DataFrame对象转换为以时期索引:
rng=pd.date_range('1/1/2000',periods=3,freq='M')
ts=Series(np.random.randn(3),index=rng)
pts=ts.to_period()
print ts
print pts
结果为:
2000-01-31 0.301329
2000-02-29 -0.927125
2000-03-31 0.369884
Freq: M, dtype: float64
2000-01 0.301329
2000-02 -0.927125
2000-03 0.369884
Freq: M, dtype: float64
由于时期指的是非重叠时间区间,因此对于给定的频率,一个时间戳只能属于一个时期。新PeriodIndex的频率默认是从时间戳推断而来的,你也可以指定任何别的频率。结果中允许存在重复时期
rng=pd.date_range('1/29/2000',periods=6,freq='D')
ts2=Series(np.random.randn(6),index=rng)
print ts2.to_period('M')
结果为:
2000-01 0.591006
2000-01 0.326477
2000-01 -2.997369
2000-02 0.140095
2000-02 0.001204
2000-02 -0.276570
Freq: M, dtype: float64
要转换为时间戳,使用to_timestamp即可
pts=ts.to_period()
print pts
print pts.to_timestamp(how='end')
结果为:
2000-01 0.188389
2000-02 -0.967632
2000-03 -0.740213
Freq: M, dtype: float64
2000-01-31 0.188389
2000-02-29 -0.967632
2000-03-31 -0.740213
Freq: M, dtype: float64
4.通过数组创建PeriodIndex
固定频率的数据集通常会将时间信息分开存放在多个列中。如,在下面这个宏观经济数据集中,年度和季度就分别存放在不同的列中
data=pd.read_csv('macrodata.csv')
print data.year
print data.quarter
将这两个数组以及一个频率传入PeriodIndex,就可以将它们合并成DataFrame的一个索引
index=pd.PeriodIndex(year=data.year,quarter=data.quarter,freq='Q-DEC')
print index
data.index=index
print data.infl
结果为:
PeriodIndex(['1959Q1', '1959Q2', '1959Q3', '1959Q4', '1960Q1', '1960Q2',
'1960Q3', '1960Q4', '1961Q1', '1961Q2',
...
'2007Q2', '2007Q3', '2007Q4', '2008Q1', '2008Q2', '2008Q3',
'2008Q4', '2009Q1', '2009Q2', '2009Q3'],
dtype='int64', length=203, freq='Q-DEC')
1959Q1 0.00
1959Q2 2.34
1959Q3 2.74
1959Q4 0.27
1960Q1 2.31
1960Q2 0.14
1960Q3 2.70
1960Q4 1.21
1961Q1 -0.40
1961Q2 1.47
1961Q3 0.80
1961Q4 0.80
1962Q1 2.26
1962Q2 0.13
1962Q3 2.11
1962Q4 0.79