我有一个时间序列索引 tidx
,我想将其分解为 2 年的 block 。这是我笨拙的做法。
定义 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
获取每个 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
什么是有效/不太笨拙的方法?
最佳答案
创建查找 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对象。
关于python - 如何获得每个半年日期的 2 年期限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034304/