如何获得每个半年度日期的2年期限

时间:2016-12-08 07:46:05

标签: python pandas

我有一个时间序列索引tidx,我想分成两年的时间段。这是我笨拙的做法。

定义tdf和随播广告tidx = pd.date_range('1996-12-31', periods=8, freq='2Q') tdf = pd.DataFrame(tidx.rename('date'), tidx.rename('tidx')) tdf

pidx

enter image description here

定义期间索引p_lookup和随播广告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_asof

enter image description here

使用pd.Period获取每tidx 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 个对象
这就是我之后的事情

{{1}}

这样做有效/不那么笨拙的方法是什么?

2 个答案:

答案 0 :(得分:2)

创建要比较的查找DF的逻辑与您的非常相似。唯一的变化是,通过在数据帧上使用asfreq函数可以快速生成年度频率,我们只需要检索这些索引。

可以通过将这些日期抵消一年(滞后)并允许它从第二天开始进行查找。与之前一样,可以执行merge_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)

enter image description here

注意: 获得的时间段类型为int,而非Period对象。

答案 1 :(得分:1)

这是一种仅使用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
相关问题