如何用Polars group_by_dynamic对时间序列下采样并保留空区间
Polars下采样保留空时间区间并前向填充
默认group_by_dynamic仅返回存在数据的时间区间,要生成完整的1秒间隔(含无数据空区间)并完成前向填充,可通过以下两种方式实现:
方法1:利用group_by_dynamic内置参数
通过include_empty=True强制生成所有符合间隔的时间区间,再补全空值:
# 按1秒分组,保留空区间,聚合取各列最后值 downsampled = taq_df.group_by_dynamic( "timestamp", every='1s', include_empty=True # 关键参数:保留无数据的秒级区间 ).agg(pl.exclude("bestex_timestamp").last()) # 前向填充空值 downsampled = downsampled.fill_null(strategy="forward")
方法2:手动生成完整时间轴左连接
若需自定义时间范围(比如扩展原数据的起止时间),可先构建完整的1秒序列,再和聚合结果关联:
# 获取原数据的时间边界 time_min = taq_df["timestamp"].min() time_max = taq_df["timestamp"].max() # 生成覆盖全范围的1秒间隔时间序列 full_time_axis = pl.DataFrame({ "timestamp": pl.date_range(start=time_min, end=time_max, interval='1s') }) # 原数据下采样聚合 aggregated_data = taq_df.group_by_dynamic( "timestamp", every='1s' ).agg(pl.exclude("bestex_timestamp").last()) # 左连接得到完整区间,执行前向填充 final_result = full_time_axis.join(aggregated_data, on="timestamp", how="left").fill_null(strategy="forward")
注:若原时间戳包含毫秒/微秒精度,group_by_dynamic会自动将时间截断至1秒间隔,无需额外处理。
内容的提问来源于stack exchange,提问作者Akhil Babu
相关产品推荐
相关产品推荐

