我有一个时间序列索引tidx
,我想分成两年的时间段。这是我笨拙的做法。
定义tdf
和随播广告tidx = pd.date_range('1996-12-31', periods=8, freq='2Q')
tdf = pd.DataFrame(tidx.rename('date'), tidx.rename('tidx'))
tdf
pidx
定义期间索引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
使用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}}
这样做有效/不那么笨拙的方法是什么?
答案 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)
注意: 获得的时间段类型为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