当前位置 : 主页 > 编程语言 > python >

python_时间序列_时期及算数运算

来源:互联网 收集:自由互联 发布时间:2022-07-19
python_时间序列_时期及算数运算 Periods and Period Arithmetic # 11.5 时期及其算术运算 # 时期(period)表示的是时间区间,⽐如数⽇、数⽉、数季、数 # 年等。Period类所表示的就是这种数据类型


python_时间序列_时期及算数运算

Periods and Period Arithmetic
# 11.5 时期及其算术运算
# 时期(period)表示的是时间区间,⽐如数⽇、数⽉、数季、数
# 年等。Period类所表示的就是这种数据类型,其构造函数需要⽤
# 到⼀个字符串或整数,以及表11-4中的频率:
p = pd.Period(2007, freq='A-DEC')
p
Period('2007', 'A-DEC')
# 这⾥,这个Period对象表示的是从2007年1⽉1⽇到2007年12⽉
# 31⽇之间的整段时间。只需对Period对象加上或减去⼀个整数即
# 可达到根据其频率进⾏位移的效果:
p + 5
p - 2
Period('2005', 'A-DEC')
如果两个Period对象拥有相同的频率,则它们的差就是它们之间
# 的单位数量:
# 如果两个Period对象拥有相同的频率,则它们的差就是它们之间
# 的单位数量:
pd.Period('2014', freq='A-DEC') - p
7
period_range函数可⽤于创建规则的时期范围:
# period_range函数可⽤于创建规则的时期范围:
rng = pd.period_range('2000-01-01', '2000-06-30', freq='M')
rng
PeriodIndex(['2000-01', '2000-02', '2000-03', '2000-04', '2000-05', '2000-06'], dtype='period[M]', freq='M')
PeriodIndex类保存了⼀组Period,它可以在任何pandas数据结
# 构中被⽤作轴索引:
# PeriodIndex类保存了⼀组Period,它可以在任何pandas数据结
# 构中被⽤作轴索引:
pd.Series(np.random.randn(6), index=rng)
2000-01 1.863884
2000-02 -1.358335
2000-03 0.487218
2000-04 2.306839
2000-05 -0.750330
2000-06 2.063482
Freq: M, dtype: float64
如果你有⼀个字符串数组,你也可以使⽤PeriodIndex类:
# 如果你有⼀个字符串数组,你也可以使⽤PeriodIndex类:
values = ['2001Q3', '2002Q2', '2003Q1']
index = pd.PeriodIndex(values, freq='Q-DEC')
index
PeriodIndex(['2001Q3', '2002Q2', '2003Q1'], dtype='period[Q-DEC]', freq='Q-DEC')
Period Frequency Conversion
时期的频率转换
# 451
# Period和PeriodIndex对象都可以通过其asfreq⽅法被转换成别的
# 频率。假设我们有⼀个年度时期,希望将其转换为当年年初或年
# 末的⼀个⽉度时期。该任务⾮常简单:
# 时期的频率转换
# 451
# Period和PeriodIndex对象都可以通过其asfreq⽅法被转换成别的
# 频率。假设我们有⼀个年度时期,希望将其转换为当年年初或年
# 末的⼀个⽉度时期。该任务⾮常简单:
p = pd.Period('2007', freq='A-DEC')
p
p.asfreq('M', how='start')
p.asfreq('M', how='end')
Period('2007-12', 'M')
你可以将Period('2007','A-DEC')看做⼀个被划分为多个⽉度时期
# 的时间段中的游标。图11-1对此进⾏了说明。对于⼀个不以12⽉
# 结束的财政年度,⽉度⼦时期的归属情况就不⼀样了:
# 你可以将Period('2007','A-DEC')看做⼀个被划分为多个⽉度时期
# 的时间段中的游标。图11-1对此进⾏了说明。对于⼀个不以12⽉
# 结束的财政年度,⽉度⼦时期的归属情况就不⼀样了:
p = pd.Period('2007', freq='A-JUN')
p
p.asfreq('M', 'start')
p.asfreq('M', 'end')
Period('2007-06', 'M')
在将⾼频率转换为低频率时,超时期(superperiod)是由⼦时
# 期(subperiod)所属的位置决定的。例如,在A-JUN频率中,
# ⽉份“2007年8⽉”实际上是属于周期“2008年”的:
# 在将⾼频率转换为低频率时,超时期(superperiod)是由⼦时
# 期(subperiod)所属的位置决定的。例如,在A-JUN频率中,
# ⽉份“2007年8⽉”实际上是属于周期“2008年”的:
p = pd.Period('Aug-2007', 'M')
p.asfreq('A-JUN')
Period('2008', 'A-JUN')
完整的PeriodIndex或TimeSeries的频率转换⽅式也是如此:
# 完整的PeriodIndex或TimeSeries的频率转换⽅式也是如此:
rng = pd.period_range('2006', '2009', freq='A-DEC')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts
ts.asfreq('M', how='start')
2006-01 -0.620024
2007-01 0.727667
2008-01 -3.037635
2009-01 -0.764396
Freq: M, dtype: float64
这⾥,根据年度时期的第⼀个⽉,每年的时期被取代为每⽉的时
# 期。如果我们想要每年的最后⼀个⼯作⽇,我们可以使⽤“B”频
# 率,并指明想要该时期的末尾:
# 这⾥,根据年度时期的第⼀个⽉,每年的时期被取代为每⽉的时
# 期。如果我们想要每年的最后⼀个⼯作⽇,我们可以使⽤“B”频
# 率,并指明想要该时期的末尾:
ts.asfreq('B', how='end')
2006-12-29 -0.620024
2007-12-31 0.727667
2008-12-31 -3.037635
2009-12-31 -0.764396
Freq: B, dtype: float64
Quarterly Period Frequencies
按季度计算的时期频率
# 季度型数据在会计、⾦融等领域中很常⻅。许多季度型数据都会
# 涉及“财年末”的概念,通常是⼀年12个⽉中某⽉的最后⼀个⽇历
# ⽇或⼯作⽇。就这⼀点来说,时期"2012Q4"根据财年末的不同
# 会有不同的含义。pandas⽀持12种可能的季度型频率,即QJAN到Q-DEC:
# 按季度计算的时期频率
# 季度型数据在会计、⾦融等领域中很常⻅。许多季度型数据都会
# 涉及“财年末”的概念,通常是⼀年12个⽉中某⽉的最后⼀个⽇历
# ⽇或⼯作⽇。就这⼀点来说,时期"2012Q4"根据财年末的不同
# 会有不同的含义。pandas⽀持12种可能的季度型频率,即Q•JAN到Q-DEC:
p = pd.Period('2012Q4', freq='Q-JAN')
p
Period('2012Q4', 'Q-JAN')
在以1⽉结束的财年中,2012Q4是从11⽉到1⽉(将其转换为⽇
# 型频率就明⽩了)。图11-2对此进⾏了说明:
# 在以1⽉结束的财年中,2012Q4是从11⽉到1⽉(将其转换为⽇
# 型频率就明⽩了)。图11-2对此进⾏了说明:
p.asfreq('D', 'start')
p.asfreq('D', 'end')
Period('2012-01-31', 'D')
因此,Period之间的算术运算会⾮常简单。例如,要获取该季度
# 倒数第⼆个⼯作⽇下午4点的时间戳,你可以这样:
# 因此,Period之间的算术运算会⾮常简单。例如,要获取该季度
# 倒数第⼆个⼯作⽇下午4点的时间戳,你可以这样:
p4pm = (p.asfreq('B', 'e') - 1).asfreq('T', 's') + 16 * 60
p4pm
p4pm.to_timestamp()
Timestamp('2012-01-30 16:00:00')
period_range可⽤于⽣成季度型范围。季度型范围的算术运算也
# 跟上⾯是⼀样的:
# period_range可⽤于⽣成季度型范围。季度型范围的算术运算也
# 跟上⾯是⼀样的:
rng = pd.period_range('2011Q3', '2012Q4', freq='Q-JAN')
ts = pd.Series(np.arange(len(rng)), index=rng)
ts
new_rng = (rng.asfreq('B', 'e') - 1).asfreq('T', 's') + 16 * 60
ts.index = new_rng.to_timestamp()
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
### Converting Timestamps to Periods (and Back)
将Timestamp转换为Period(及其反向过程)
# 通过使⽤to_period⽅法,可以将由时间戳索引的Series和
# DataFrame对象转换为以时期索引:
# 将Timestamp转换为Period(及其反向过程)
# 通过使⽤to_period⽅法,可以将由时间戳索引的Series和
# DataFrame对象转换为以时期索引:
rng = pd.date_range('2000-01-01', periods=3, freq='M')
ts = pd.Series(np.random.randn(3), index=rng)
ts
pts = ts.to_period()
pts
2000-01 -1.407223
2000-02 0.941227
2000-03 0.082188
Freq: M, dtype: float64
由于时期指的是⾮重叠时间区间,因此对于给定的频率,⼀个时
# 间戳只能属于⼀个时期。新PeriodIndex的频率默认是从时间戳
# 推断⽽来的,你也可以指定任何别的频率。结果中允许存在重复
# 时期:
# 由于时期指的是⾮重叠时间区间,因此对于给定的频率,⼀个时
# 间戳只能属于⼀个时期。新PeriodIndex的频率默认是从时间戳
# 推断⽽来的,你也可以指定任何别的频率。结果中允许存在重复
# 时期:
rng = pd.date_range('1/29/2000', periods=6, freq='D')
ts2 = pd.Series(np.random.randn(6), index=rng)
ts2
ts2.to_period('M')
2000-01 2.277293
2000-01 0.742658
2000-01 0.108707
2000-02 -1.509031
2000-02 1.198614
2000-02 0.551394
Freq: M, dtype: float64
要转换回时间戳,使⽤to_timestamp即可:
# 要转换回时间戳,使⽤to_timestamp即可:
pts = ts2.to_period()
pts
pts.to_timestamp(how='end')
2000-01-29 2.277293
2000-01-30 0.742658
2000-01-31 0.108707
2000-02-01 -1.509031
2000-02-02 1.198614
2000-02-03 0.551394
Freq: D, dtype: float64
Creating a PeriodIndex from Arrays
# 通过数组创建PeriodIndex
# 固定频率的数据集通常会将时间信息分开存放在多个列中。例
# 如,在下⾯这个宏观经济数据集中,年度和季度就分别存放在不
# 同的列中:
data = pd.read_csv('examples/macrodata.csv')
# data.head(5)
# data.year
# data.quarter
# 通过通过将这些数组以及⼀个频率传⼊PeriodIndex,就可以将
# 它们合并成DataFrame的⼀个索引:
index = pd.PeriodIndex(year=data.year, quarter=data.quarter,
freq='Q-DEC')
index
data.index = index
# data.infl


上一篇:python_透视表和交叉表
下一篇:没有了
网友评论