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结束等奇怪的周期时,该表是灵活的。那么从您的角度来看,什么是低效的呢?步骤很多。我觉得时间和周期函数太多了,必须有一种更简洁的方法。