时间序列(二)
本文中可能使用的数据集来自: 《利用python进行数据分析》数据集
时间区间和时间算数
时间区间表示的是一个时间范围,如从2007年1月1日到2007年12月31日就是一个时间区间。pandas中包含一个Period类,用于表示时间区间。
可以使用以下语句来创建一个Period对象:
p1 = pd.Period("2007",'A-DEC')
#表示2007年1月1日到2007年12月31日,A-DEC表示12月份的最后一个工作日
p2 = pd.Period("2020","A-JUN")
#表示2019年7月1日到2020年6月30日,A-JUN表示6月份的最后一个工作日
对Period对象进行加减可以轻松的对时间区间进行移位,如果是两个相同单位的时间区间相减,则会得到它们之间差的单位数。
使用pd.period_range函数则可以构造一个时间区间的序列:
rng = pd.period_range("2001-01-01","2001-6-30",freq="M")
print(rng)
# PeriodIndex(['2001-01', '2001-02', '2001-03', '2001-04', '2001-05', '2001-06'], dtype='period[M]', freq='M')
区间频率转换
对于一个年度区间,我们可以使用asfreq方法转换为月度区间:
p = pd.Period("2020","A-JUN")
#表示2019年7月1日到2020年6月30日,A-JUN表示6月份的最后一个工作日
p1 = p.asfreq("M","start")
#代表p第一个月,即2019年6月这个时间范围
print(p1)
# 2019-07
p2 = p.asfreq("M","end")
#代表p最后一个月,即2020年6月这个时间范围
print(p2)
# 2020-06
我们也可以将月度区间转换为年度区间:
p = pd.Period("2007-08","M")
#代表2007年8月这个时间段
p1 = p.asfreq("A-JUN")
#会自动根据子区间所属的范围来确定年度区间
print(p1)
# 2008 表示2007年7月到2008年6月
对一一个以一系列PeriodIndex作为索引的DataFrame或者Series对象来说,其也包含着asfreq方法,来方便的对索引进行转换:
rng = pd.period_range("2006","2009",freq="A-DEC")
print(rng)
# PeriodIndex(['2006', '2007', '2008', '2009'], dtype='period[A-DEC]', freq='A-DEC')
ts = pd.Series(np.random.rand(len(rng)),index=rng)
print(ts)
# PeriodIndex(['2006', '2007', '2008', '2009'], dtype='period[A-DEC]', freq='A-DEC')
# 2006 0.984073
# 2007 0.075052
# 2008 0.207786
# 2009 0.297224
# Freq: A-DEC, dtype: float64
print(ts.asfreq("M",how="start"))
# 2006-01 0.984073
# 2007-01 0.075052
# 2008-01 0.207786
# 2009-01 0.297224
# Freq: M, dtype: float64
季度区间频率
在金融领域中,时间区间往往使用的的是季度(3个月),在pandas中我们可以方便的创建以季度为单位的时间区间:
p = pd.Period("2012Q2",freq="Q-JAN")
#表示2011年11月到2012年1月(3个月,即一个季度),"Q-JAN表示一个边界,即1月
#2012Q4表示以2011年1月为边界的第4个季度,即2012Q3贼代表2011-7到2011-10,2012Q2代表2011-4到2011-6,
#2012Q1代表2011-1到2011-3
当然我们可以对其进行频率的转换:
print(p.asfreq("D","start"))
# 2011-11-01
我们也可生成一个指定的季度序列:
rng = pd.period_range("2011Q3","2012Q4",freq="Q-JAN")
#表示以1月为起点,2011年的第三个季度到2012年第四个区间所包含的季度
ts = pd.Series(np.random.randn(len(rng)),index=rng)
print(ts)
# 2011Q3 0.471435
# 2011Q4 -1.190976
# 2012Q1 1.432707
# 2012Q2 -0.312652
# 2012Q3 -0.720589
# 2012Q4 0.887163
# Freq: Q-JAN, dtype: float64
时间戳与时间区间的相互转换
对于一个以时间戳序列为索引的Sereis或者DataFrame对象可以使用to_period方法来将其索引转换为时间区间:
rng = pd.date_range("2000-01-01",periods=3,freq

最低0.47元/天 解锁文章
1015

被折叠的 条评论
为什么被折叠?



