Python 如何获得每半年一次的2年期限
我有一个时间序列索引Python 如何获得每半年一次的2年期限,python,pandas,Python,Pandas,我有一个时间序列索引tidx,我想把它分为2年。这是我笨拙的做事方式 定义tidx和配套tdf tidx = pd.date_range('1996-12-31', periods=8, freq='2Q') tdf = pd.DataFrame(tidx.rename('date'), tidx.rename('tidx')) tdf pidx = pd.period_range(tidx[0], tidx[-1], freq='2A-NOV') ps = lambda x: pd.Seri
tidx
,我想把它分为2年。这是我笨拙的做事方式
定义tidx
和配套tdf
tidx = pd.date_range('1996-12-31', periods=8, freq='2Q')
tdf = pd.DataFrame(tidx.rename('date'), tidx.rename('tidx'))
tdf
pidx = pd.period_range(tidx[0], tidx[-1], freq='2A-NOV')
ps = lambda x: pd.Series([x, x.start_time], ['period', 'date'])
p_lookup = pidx.to_series().apply(ps)
p_lookup
定义周期索引pidx
和相关p\u查找
tidx = pd.date_range('1996-12-31', periods=8, freq='2Q')
tdf = pd.DataFrame(tidx.rename('date'), tidx.rename('tidx'))
tdf
pidx = pd.period_range(tidx[0], tidx[-1], freq='2A-NOV')
ps = lambda x: pd.Series([x, x.start_time], ['period', 'date'])
p_lookup = pidx.to_series().apply(ps)
p_lookup
使用pd.merge\u asof
按tidx
获取pd.Period
对象
这就是我想要的
pd.merge_asof(tdf, p_lookup).set_index('date').period
date
1996-12-31 1997
1997-06-30 1997
1997-12-31 1997
1998-06-30 1997
1998-12-31 1999
1999-06-30 1999
1999-12-31 1999
2000-06-30 1999
Name: period, dtype: object
做这件事的有效/不那么笨拙的方法是什么?这里有一种只使用tidx的方法,但它意味着你从起点开始做数学减法:
nb_years = 2
a = tidx.to_period('1A-NOV').to_series()
a
Out[145]:
1997 1997
1997 1997
1998 1998
1998 1998
1999 1999
1999 1999
2000 2000
2000 2000
Freq: A-NOV, dtype: object
a.mask((a - a[0]).mod(nb_years) !=0, np.nan).ffill()
Out[146]:
1997 1997
1997 1997
1998 1997
1998 1997
1999 1999
1999 1999
2000 1999
2000 1999
Freq: A-NOV, dtype: object
创建查找
DF
进行比较的逻辑与您的非常相似。唯一的变化是,使用数据帧上的asfreq
函数可以快速生成年度频率,我们只需要检索这些指数
查找可以通过将这些日期抵消一年(滞后)并允许从第二天开始进行。与前面一样,可以执行merge\u asof
以匹配最近值上的日期
from pandas.tseries.offsets import *
idx = tdf.asfreq('2A-NOV').index
lk_up = pd.DataFrame({'date': idx-DateOffset(years=1)+Day(1), 'period': idx.year})
pd.merge_asof(tdf, lk_up)
注意:获取的周期类型为
int
而不是period object。我不认为这很笨拙,它实际上为您提供了一个明确的周期查找表,当您需要处理FY结束等奇怪的周期时,该表是灵活的。那么从您的角度来看,什么是低效的呢?步骤很多。我觉得时间和周期函数太多了,必须有一种更简洁的方法。