如何避免Pandas resample下采样时填充缺失日期的间隔数据
问题:Pandas下采样时避免填充缺失日期的空值
我有一个采样间隔为1分钟的pandas Series,包含2023年10月18日晚、10月20日早的测量数据,10月19日无数据。需要将其下采样至5分钟间隔,但使用series.resample("5T").mean()会自动填充10月19日的NaN值,series.resample("5T").sum()则填充0值——我需要仅保留原Series中存在的日期对应的下采样结果,不为缺失的日期段生成任何数据。
原始测试代码及输出:
import pandas as pd index1 = pd.date_range("2023-10-18 23:50", "2023-10-18 23:59", freq="T") index2 = pd.date_range("2023-10-20 00:00", "2023-10-20 00:10", freq="T") series1 = pd.Series(range(len(index1)), index=index1) series2 = pd.Series(range(100, len(index2)+100), index=index2) series = pd.concat([series1, series2]) # 会填充10月19日NaN的resample print(series.resample("5T").mean())
输出结果:
2023-10-18 23:50:00 2.0 2023-10-18 23:55:00 7.0 2023-10-19 00:00:00 NaN 2023-10-19 00:05:00 NaN 2023-10-19 00:10:00 NaN ... 2023-10-19 23:50:00 NaN 2023-10-19 23:55:00 NaN 2023-10-20 00:00:00 102.0 2023-10-20 00:05:00 107.0 2023-10-20 00:10:00 110.0 Freq: 5T, Length: 293, dtype: float64
解决方案:按日期分组后单独resample
通过按日期分组,再对每个日期组独立执行resample,可以只处理原始数据存在的日期,避免生成缺失日期的空值。
实现代码
import pandas as pd # 构造原始数据(同测试代码) index1 = pd.date_range("2023-10-18 23:50", "2023-10-18 23:59", freq="T") index2 = pd.date_range("2023-10-20 00:00", "2023-10-20 00:10", freq="T") series1 = pd.Series(range(len(index1)), index=index1) series2 = pd.Series(range(100, len(index2)+100), index=index2) series = pd.concat([series1, series2]) # 按日期分组后分别执行resample result = series.groupby(series.index.date).apply(lambda x: x.resample("5T").mean()).droplevel(0) print(result)
输出结果
2023-10-18 23:50:00 2.0 2023-10-18 23:55:00 7.0 2023-10-20 00:00:00 102.0 2023-10-20 00:05:00 107.0 2023-10-20 00:10:00 110.0 dtype: float64
原理说明
series.index.date将每个时间戳提取为日期对象,以此分组后,仅会生成原始数据存在的日期组(即10月18日、10月20日两组),10月19日无数据,不会生成对应组。- 对每个日期组单独执行
resample("5T").mean(),只会处理该日期内的时间区间,不会跨日期生成空值。 droplevel(0)移除分组产生的日期层级,恢复为单一的时间索引结构,符合预期输出格式。
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

