python_时间序列_时期及算数运算(python 时间序列)

网友投稿 317 2022-08-24


python_时间序列_时期及算数运算(python 时间序列)

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

Periods and Period Arithmetic# 11.5 时期及其算术运算# 时期(period)表示的是时间区间,⽐如数⽇、数⽉、数季、数# 年等。Period类所表示的就是这种数据类型,其构造函数需要⽤# 到⼀个字符串或整数,以及表11-4中的频率:p = pd.Period(2007, freq='A-DEC')pPeriod('2007', 'A-DEC')# 这⾥,这个Period对象表示的是从2007年1⽉1⽇到2007年12⽉# 31⽇之间的整段时间。只需对Period对象加上或减去⼀个整数即# 可达到根据其频率进⾏位移的效果:p + 5p - 2Period('2005', 'A-DEC')如果两个Period对象拥有相同的频率,则它们的差就是它们之间# 的单位数量:# 如果两个Period对象拥有相同的频率,则它们的差就是它们之间# 的单位数量:pd.Period('2014', freq='A-DEC') - p7period_range函数可⽤于创建规则的时期范围:# period_range函数可⽤于创建规则的时期范围:rng = pd.period_range('2000-01-01', '2000-06-30', freq='M')rngPeriodIndex(['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.8638842000-02 -1.3583352000-03 0.4872182000-04 2.3068392000-05 -0.7503302000-06 2.063482Freq: M, dtype: float64如果你有⼀个字符串数组,你也可以使⽤PeriodIndex类:# 如果你有⼀个字符串数组,你也可以使⽤PeriodIndex类:values = ['2001Q3', '2002Q2', '2003Q1']index = pd.PeriodIndex(values, freq='Q-DEC')indexPeriodIndex(['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')pp.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')pp.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)tsts.asfreq('M', how='start')2006-01 -0.6200242007-01 0.7276672008-01 -3.0376352009-01 -0.764396Freq: M, dtype: float64这⾥,根据年度时期的第⼀个⽉,每年的时期被取代为每⽉的时# 期。如果我们想要每年的最后⼀个⼯作⽇,我们可以使⽤“B”频# 率,并指明想要该时期的末尾:# 这⾥,根据年度时期的第⼀个⽉,每年的时期被取代为每⽉的时# 期。如果我们想要每年的最后⼀个⼯作⽇,我们可以使⽤“B”频# 率,并指明想要该时期的末尾:ts.asfreq('B', how='end')2006-12-29 -0.6200242007-12-31 0.7276672008-12-31 -3.0376352009-12-31 -0.764396Freq: B, dtype: float64Quarterly Period Frequencies按季度计算的时期频率# 季度型数据在会计、⾦融等领域中很常⻅。许多季度型数据都会# 涉及“财年末”的概念,通常是⼀年12个⽉中某⽉的最后⼀个⽇历# ⽇或⼯作⽇。就这⼀点来说,时期"2012Q4"根据财年末的不同# 会有不同的含义。pandas⽀持12种可能的季度型频率,即QJAN到Q-DEC:# 按季度计算的时期频率# 季度型数据在会计、⾦融等领域中很常⻅。许多季度型数据都会# 涉及“财年末”的概念,通常是⼀年12个⽉中某⽉的最后⼀个⽇历# ⽇或⼯作⽇。就这⼀点来说,时期"2012Q4"根据财年末的不同# 会有不同的含义。pandas⽀持12种可能的季度型频率,即Q•JAN到Q-DEC:p = pd.Period('2012Q4', freq='Q-JAN')pPeriod('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 * 60p4pmp4pm.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)tsnew_rng = (rng.asfreq('B', 'e') - 1).asfreq('T', 's') + 16 * 60ts.index = new_rng.to_timestamp()ts2010-10-28 16:00:00 02011-01-28 16:00:00 12011-04-28 16:00:00 22011-07-28 16:00:00 32011-10-28 16:00:00 42012-01-30 16:00:00 5dtype: 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)tspts = ts.to_period()pts2000-01 -1.4072232000-02 0.9412272000-03 0.082188Freq: 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)ts2ts2.to_period('M')2000-01 2.2772932000-01 0.7426582000-01 0.1087072000-02 -1.5090312000-02 1.1986142000-02 0.551394Freq: M, dtype: float64要转换回时间戳,使⽤to_timestamp即可:# 要转换回时间戳,使⽤to_timestamp即可:pts = ts2.to_period()ptspts.to_timestamp(how='end')2000-01-29 2.2772932000-01-30 0.7426582000-01-31 0.1087072000-02-01 -1.5090312000-02-02 1.1986142000-02-03 0.551394Freq: D, dtype: float64Creating 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')indexdata.index = index# data.infl


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python_透视表和交叉表(Python 透视表)
下一篇:tcc分布式事务框架体系解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~