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

标签 python pandas

我有一个时间序列索引 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

enter image description here

定义周期索引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

enter image description here

使用 pd.merge_asof 获取每个 tidxpd.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)

enter image description here

注意:获取的周期是int类型,而不是Period对象。

关于python - 如何获得每个半年日期的 2 年期限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034304/

相关文章:

python - 直方图操作以删除不需要的数据

python - Paramiko 会被移植到 Python 3.x 吗?

Python 将一列拆分为多列并将拆分的列重新附加到原始数据帧中

python - 删除日期为特定条件的行 Pandas

python - 使用谷歌应用引擎将文件插入谷歌驱动器。使用的python客户端api

javascript - 使用Python-Shell运行Python脚本后无响应

python - 使用 Pandas 按日期时间间隔分组

python - 通过For循环修改Pandas系列

Pandas 日期范围不包括开始日期和结束日期

python - 上传文件到jupyter时忽略ds_store文件的建议