利用python进行数据分析-时间序列3

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值