Pandas 0.22重采样仅保留完整4H区间,移除不完整区间
解决Pandas重采样后保留完整区间的问题
你完全不需要手动截断不完整的区间,Pandas可以通过聚合时统计数据量+过滤的方式轻松实现这个需求,而且完全兼容你使用的0.22版本。
核心思路
你的原始数据是严格1小时粒度的,所以一个完整的4小时区间必然包含恰好4条原始记录。我们只需要在重采样时统计每个区间内的原始数据条数,之后过滤掉条数不等于4的区间即可。
修改后的代码(简洁版)
# 先执行重采样聚合 resampled_obj = srcData.resample('4H') outputData = resampled_obj.agg({ 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum', 'vwap': 'mean', 'turnover': 'sum', 'symbol': 'first' }) # 过滤出仅包含4条原始数据的完整区间 outputData = outputData[resampled_obj.size() == 4]
另一种直观实现方式
如果你想更直观看到每个区间的数据量,也可以在聚合时额外添加计数列,再过滤:
# 重采样时同时统计每个区间的原始数据数量 outputData = srcData.resample('4H').agg({ 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum', 'vwap': 'mean', 'turnover': 'sum', 'symbol': 'first', 'timestamp': 'count' # 用任意非空列计数即可 }) # 过滤完整区间并移除计数列 outputData = outputData[outputData['timestamp'] == 4].drop('timestamp', axis=1)
效果说明
这两种方法都会自动剔除像2018-05-08 12:00:00这样仅包含1条原始数据的不完整区间,最终输出就是你期望的仅保留完全闭合的4小时粒度数据。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

