看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Pandas 周期索引(PeriodIndex)是针对周期数据的专门索引,可以快速进行周期数据进行分析。
可以使用 period_range 可以构造 Period 序列:
prng = pd.period_range('1/1/2011', '1/1/2012', freq='M')
prng
'''
PeriodIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05', '2011-06',
'2011-07', '2011-08', '2011-09', '2011-10', '2011-11', '2011-12',
'2012-01'],
dtype='period[M]', freq='M')
'''
pd.PeriodIndex 也可以直接构建:
pd.PeriodIndex(['2011-1', '2011-2', '2011-3'], freq='M')
# PeriodIndex(['2011-01', '2011-02', '2011-03'], dtype='period[M]', freq='M')
通过倍频将输出一个周期范围,该周期具有倍频范围:
pd.period_range(start='2014-01', freq='3M', periods=4)
# PeriodIndex(['2014-01', '2014-04', '2014-07', '2014-10'], dtype='period[3M]', freq='3M')
如果 start或 end 是 Period 对象,则它们将用作 PeriodIndex 的锚定端点,其频率与PeriodIndex 构造函数的频率匹配。
pd.period_range(start=pd.Period('2017Q1', freq='Q'),
end=pd.Period('2017Q2', freq='Q'),
freq='M')
# PeriodIndex(['2017-03', '2017-04', '2017-05', '2017-06'], dtype='period[M]', freq='M')
就像 DatetimeIndex 一样,PeriodInde x也可以用于索引对象:
ps = pd.Series(np.random.randn(len(prng)), prng)
ps
'''
2011-01 2.518126
2011-02 1.320531
2011-03 -1.734174
2011-04 -1.633595
2011-05 -1.378595
2011-06 0.811348
2011-07 -1.129544
2011-08 -0.125929
2011-09 -0.236788
2011-10 -1.465034
2011-11 0.042106
2011-12 0.895732
2012-01 -0.026086
Freq: M, dtype: float64
'''
PeriodIndex 支持与 Period 相同的规则加法和减法:
idx = pd.period_range('2014-07-01 09:00', periods=5, freq='H')
idx
'''
PeriodIndex(['2014-07-01 09:00', '2014-07-01 10:00', '2014-07-01 11:00',
'2014-07-01 12:00', '2014-07-01 13:00'],
dtype='period[H]', freq='H')
'''
idx + pd.offsets.Hour(2)
'''
PeriodIndex(['2014-07-01 11:00', '2014-07-01 12:00', '2014-07-01 13:00',
'2014-07-01 14:00', '2014-07-01 15:00'],
dtype='period[H]', freq='H')
'''
idx = pd.period_range('2014-07', periods=5, freq='M')
idx
# PeriodIndex(['2014-07', '2014-08', '2014-09', '2014-10', '2014-11'], dtype='period[M]', freq='M')
idx + pd.offsets.MonthEnd(3)
# PeriodIndex(['2014-10', '2014-11', '2014-12', '2015-01', '2015-02'], dtype='period[M]', freq='M')
如果想转换为周期,可以用 .astype(...), 它允许人们更改 PeriodIndex 的频率,例如.asfreq(),并将 DatetimeIndex 转换为PeriodIndex,例如to_period():
# 频率从月转为天
pi.astype('period[D]')
# PeriodIndex(['2016-01-31', '2016-02-29', '2016-03-31'], dtype='period[D]', freq='D')
# 转换为 DatetimeIndex
pi.astype('datetime64[ns]')
# DatetimeIndex(['2016-01-01', '2016-02-01', '2016-03-01'], dtype='datetime64[ns]', freq='MS')
# 转换为 PeriodIndex
dti = pd.date_range('2011-01-01', freq='M', periods=3)
dti
# DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31'], dtype='datetime64[ns]', freq='M')
dti.astype('period[M]')
# PeriodIndex(['2011-01', '2011-02', '2011-03'], dtype='period[M]', freq='M')
通过索引查询数据:
ps['2011-01']
# -2.9169013294054507
ps[datetime.datetime(2011, 12, 25):]
'''
2011-12 2.261385
2012-01 -0.329583
Freq: M, dtype: float64
'''
ps['10/31/2011':'12/31/2011']
'''
2011-10 0.056780
2011-11 0.197035
2011-12 2.261385
Freq: M, dtype: float64
'''
传递一个表示比 PeriodIndex 更低的频率的字符串将返回部分切片的数据。
ps['2011']
'''
2011-01 -2.916901
2011-02 0.514474
2011-03 1.346470
2011-04 0.816397
2011-05 2.258648
2011-06 0.494789
2011-07 0.301239
2011-08 0.464776
2011-09 -1.393581
2011-10 0.056780
2011-11 0.197035
2011-12 2.261385
Freq: M, dtype: float64
'''
dfp = pd.DataFrame(np.random.randn(600, 1),
columns=['A'],
index=pd.period_range('2013-01-01 9:00',
periods=600,
freq='T'))
dfp
'''
A
2013-01-01 09:00 -0.538468
2013-01-01 09:01 -1.365819
2013-01-01 09:02 -0.969051
2013-01-01 09:03 -0.331152
2013-01-01 09:04 -0.245334
... ...
2013-01-01 18:55 0.522460
2013-01-01 18:56 0.118710
2013-01-01 18:57 0.167517
2013-01-01 18:58 0.922883
2013-01-01 18:59 1.721104
[600 rows x 1 columns]
'''
dfp['2013-01-01 10H']
'''
A
2013-01-01 10:00 -0.308975
2013-01-01 10:01 0.542520
2013-01-01 10:02 1.061068
2013-01-01 10:03 0.754005
2013-01-01 10:04 0.352933
... ...
2013-01-01 10:55 -0.865621
2013-01-01 10:56 -1.167818
2013-01-01 10:57 -2.081748
2013-01-01 10:58 -0.527146
2013-01-01 10:59 0.802298
[60 rows x 1 columns]
'''
与DatetimeIndex一样,端点将包含在结果中。 下面的示例对从10:00到11:59的数据进行切片。
dfp['2013-01-01 10H':'2013-01-01 11H']
'''
A
2013-01-01 10:00 -0.308975
2013-01-01 10:01 0.542520
2013-01-01 10:02 1.061068
2013-01-01 10:03 0.754005
2013-01-01 10:04 0.352933
... ...
2013-01-01 11:55 -0.590204
2013-01-01 11:56 1.539990
2013-01-01 11:57 -1.224826
2013-01-01 11:58 0.578798
2013-01-01 11:59 -0.685496
[120 rows x 1 columns]
'''
更新时间:2022-04-04 10:20:07 标签:pandas 周期 索引