如何正确将日频数据重采样为小时频数据(避免末尾日期缺失问题)

大涛大大_2115

大涛大大_2115

2026-06-05

480人浏览

原创

Pandas 的 resample().ffill() 在将日频数据升频为小时频时,会因时间范围截断导致末尾日期的 23 小时缺失;根本原因是重采样默认以左闭右开区间划分桶,最后一个日期仅生成一个时间戳(当日 00:00),需通过扩展索引边界并清理冗余项来完整覆盖全部 24 小时。

pandas 的 `resample().ffill()` 在将日频数据升频为小时频时,会因时间范围截断导致末尾日期的 23 小时缺失;根本原因是重采样默认以左闭右开区间划分桶,最后一个日期仅生成一个时间戳(当日 00:00),需通过扩展索引边界并清理冗余项来完整覆盖全部 24 小时。

在使用 Pandas 对时间序列进行升频(upsampling)操作时,resample("h").ffill() 是常见做法:它将每个日度观测值向前填充至对应日内的所有小时点。但实践中常遇到一个隐蔽问题——最后一个日期只生成 1 行(如 2024-01-02 00:00),而非预期的 24 行(2024-01-02 00:00 至 2024-01-02 23:00),导致最终结果长度异常(例如 2 天本应得 48 行,却只返回 25 行)。

问题根源:Resample 的区间规则

Pandas 的 resample(freq="h") 默认按 左闭右开(left-inclusive, right-exclusive) 规则对时间索引分桶。当原始数据最后一天为 2024-01-02(无时分秒,默认为 00:00:00),重采样器将其视为一个精确的时间点,并仅分配到 [2024-01-02 00:00, 2024-01-02 01:00) 这个桶中,因此只生成该时刻一行,后续小时无数据可填充。

解决方案:主动延伸时间边界

标准做法是在原始数据末尾添加一个占位日期(+1 天)并赋 NaN 值,确保重采样器能自然延伸出完整的最后一日 24 小时桶,再通过 dropna() 清理掉新增的无效行:

青泥AI
青泥AI

一款AI论文写作工具,主要用于青泥学术AI写作辅助平台,适合需要提升相关任务效率的用户。

下载
import pandas as pd

T1 = pd.Timestamp("2024-01-01")
T2 = pd.Timestamp("2024-01-02")
T3 = pd.Timestamp("2024-01-03")  # 占位日期:确保覆盖 T2 全天

df = pd.DataFrame({
    "T": [T1, T2, T3],
    "V": [1, 2, pd.NA]  # NA 确保不干扰前向填充
})

result = (df
          .set_index("T")
          .resample("h")
          .ffill()
          .dropna(subset=["V"])  # 更安全:仅按目标列过滤
         )

print(f"Shape: {result.shape}")  # 输出: (48, 1)
print(result.index[:3].tolist())   # [Timestamp('2024-01-01 00:00:00'), ...]
print(result.index[-3:].tolist())  # [..., Timestamp('2024-01-02 21:00:00'), '22:00', '23:00']

注意事项与最佳实践

  • ✅ 始终用 dropna(subset=[col]) 替代无参数 dropna():避免意外删除其他合法空列;
  • ✅ 若原始数据含多列,建议在 ffill() 后用 bfill() 或 limit=23 控制填充深度,防止跨日污染;
  • ⚠️ 避免依赖 closed/label 参数强行调整(如 closed="right"),因其可能引发时区或边界歧义,且不解决根本逻辑;
  • ? 若处理带时区数据(如 tz_localize),务必确保占位日期与原始时区一致,否则 resample 可能报错或产生偏移;
  • ? 批量处理时,可封装为函数:
def daily_to_hourly(df, date_col, value_col):
    df = df.sort_values(date_col).copy()
    last_date = df[date_col].max()
    next_date = last_date + pd.Timedelta(days=1)
    df_ext = pd.concat([
        df,
        pd.DataFrame({date_col: [next_date], value_col: [pd.NA]})
    ], ignore_index=True)
    return (df_ext
            .set_index(date_col)
            .resample("h")
            .ffill()
            .dropna(subset=[value_col]))

# 使用示例
hourly_df = daily_to_hourly(df, "T", "V")

该方法稳定、可复现,适用于任意长度的日频时间序列,是 Pandas 升频场景下的推荐工程实践。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

2025.12.04

340

15

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2026.01.31

272

21

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

2026.04.13

791

25

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

20

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习