如何以求和为填充方法将日度索引DataFrame重采样至不规则索引?
解决日度DataFrame采样到不规则索引并求和的问题
嘿,我懂你要实现的需求——把连续日度索引的DataFrame,按照另一个不规则索引的节点,把中间日期的数据求和后对应到不规则索引上对吧?这里有两个实用的方法,我给你一步步拆解:
首先先把你的示例数据构造出来:
import pandas as pd # 连续日度的df0,每个dat值都是1 df0 = pd.DataFrame(index=pd.date_range(start='2018-03-10', periods=10)) df0['dat'] = 1 # 不规则索引的df1,取df0的部分行 df1 = df0.iloc[[0,3,4,6,9]].copy()
方法一:用asof匹配分组键(最直观高效)
这个思路是给df0里的每一个日期,找到不晚于它的最近的df1索引,然后按这个索引分组求和,最后对齐到df1的索引上:
# 给每个日期分配对应的df1分组键 df0['group_key'] = df0.index.to_series().apply(lambda x: df1.index.asof(x)) # 按分组键求和,再重索引到df1的索引确保顺序一致 result = df0.groupby('group_key')['dat'].sum().reindex(df1.index)
运行后你就得到想要的结果:
2018-03-10 1 2018-03-13 3 2018-03-14 1 2018-03-16 2 2018-03-19 3 Name: dat, dtype: int64
方法二:用区间切割(pd.cut)分组
如果你更喜欢用区间划分日期范围,也可以这么做:
# 构造区间:每个区间的右边界是df1的索引,左边界是上一个df1的索引(第一个区间左边界设为df0的起始日期) bins = [df0.index[0]] + list(df1.index[1:]) interval_bins = pd.IntervalIndex.from_arrays(df1.index, bins, closed='right') # 给df0的每个日期分配对应的区间 df0['interval'] = pd.cut(df0.index, bins=interval_bins) # 按区间求和,然后把索引替换成区间的右边界(也就是df1的索引) result = df0.groupby('interval')['dat'].sum() result.index = interval_bins.right
这个方法同样能得到和你期望完全一致的结果~
核心逻辑其实很简单:先把连续日期按照不规则索引的节点分组,对每组求和,最后把结果对齐到不规则索引上就搞定啦!
内容的提问来源于stack exchange,提问作者mankoff
相关产品推荐
相关产品推荐

