You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何将非连续日期列转换为对应日期的逐小时值

需求说明
  • 存在非连续日期数据,读取为pandas DataFrame后需要转换为小时级粒度时间序列
  • 要求仅保留每个指定日期当日00:00:00到23:00:00的24条小时记录,带US/Eastern时区
  • 不需要填充不同日期之间间隔时段的小时数据
  • 直接使用resample('H').ffill()会生成首尾日期之间全部连续小时点,不符合预期
原有测试代码(存在问题)
d = {'date': ["1/1/2014", "5/26/2014", "7/4/2014"]}
df = pd.DataFrame(data = d)
df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].dt.tz_localize('US/Eastern')
df = df.set_index('date')
df = df.resample('H').ffill()

上述代码执行后会生成2014年1月1日至2014年7月4日之间共4416个连续小时的索引,不符合需求。

实现方案

全局重采样会默认补齐时间范围内所有连续时间点,因此改为逐日期生成当日小时序列再拼接即可:

import pandas as pd

d = {'date': ["1/1/2014", "5/26/2014", "7/4/2014"]}
df = pd.DataFrame(data = d)
df['date'] = pd.to_datetime(df['date']).dt.tz_localize('US/Eastern')

# 逐个生成每个日期对应的24个小时时间点
hour_index = []
for single_day in df['date']:
    # 生成单天0点到23点共24个带时区的小时时间点
    day_hour_list = pd.date_range(
        start=single_day,
        periods=24,
        freq='H',
        tz='US/Eastern'
    )
    hour_index.extend(day_hour_list)

# 构建目标结果,如需ffill填充效果可执行以下逻辑
df = df.set_index('date')
result = df.reindex(hour_index).ffill()

结果验证

最终生成的结果共72条记录(3天*24小时),索引顺序为:

  • 2014-01-01 00:00:00-05:00 至 2014-01-01 23:00:00-05:00
  • 直接跳转至2014-05-26 00:00:00-04:00 至 2014-05-26 23:00:00-04:00
  • 直接跳转至2014-07-04 00:00:00-04:00 至 2014-07-04 23:00:00-04:00
    不存在日期间隔时段的无效小时记录,符合预期。

内容的提问来源于stack exchange,提问作者ghw29

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:21:35