基于datetime索引的Pandas时间序列重采样与插值问题求解
无循环实现方案
核心优化逻辑
- df1转日度均值:直接使用pandas内置的
resample日度聚合,无需手动循环切片计算均值 - df2缺失日期插值:先重采样生成完整日期序列(缺失值保留
NaN),再执行线性插值,避免提前填充固定值导致插值失效
优化后完整代码
import numpy as np import pandas as pd from datetime import datetime # 模拟数据生成部分和原逻辑一致 rng = pd.date_range('2000-01-01', periods=int(365*(24/3)), freq='3H') df1 = pd.DataFrame({'Val': np.random.randn(len(rng)) }, index = rng) rng2 = pd.date_range('2000-01-01', periods=365, freq='D') df2 = pd.DataFrame({'Val': np.random.randn(len(rng2)) },index = rng2) df2 = df2.drop([datetime(2000,1,5),datetime(2000,1,24)]) # 需求1:df1转日度均值,无循环实现 df3 = df1.resample('D').mean() # 需求2:df2缺失日期插值补全 # 先重采样生成完整日度序列,缺失值保留NaN df2 = df2.resample('D').asfreq() # 对NaN执行线性插值 df2 = df2.interpolate(method='linear')
逻辑说明
- 对时间序列的聚合、频率转换操作优先使用pandas原生
resample方法,内部为矢量化实现,执行效率远高于手动编写for循环切片计算 - 原插值失效的核心原因是调用
reindex时指定了fill_value=0,所有缺失日期都被提前填充为固定值0,插值方法识别不到缺失位置自然不会生效。先通过resample('D').asfreq()生成带NaN的完整序列后再插值,即可得到符合预期的线性补全结果。
内容的提问来源于stack exchange,提问作者Nihilum
相关产品推荐
相关产品推荐

