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

将日度数据重采样为小时数据时最后日期失效问题求助

问题原因与解决方案

问题根源

pandas的resample默认采用左闭右开的时间区间规则:

  • 对于2024-01-01,resample生成的区间是[2024-01-01, 2024-01-02),覆盖当天0点到23点共24个小时
  • 对于最后一个日期2024-01-02,resample的区间是[2024-01-02, 2024-01-03),但原数据中没有2024-01-03的时间点,因此只会生成该日期的起始小时(即2024-01-02 00:00:00),不会自动扩展到当日23点,最终导致结果只有25行。

解决方案

方法1:临时添加下一天的时间点

通过给原数据追加最后一个日期的下一天0点的空行,让resample生成完整的最后一天小时数据,之后再删除多余的行:

import pandas as pd
import numpy as np

T1 = pd.Timestamp("2024-01-01")
T2 = pd.Timestamp("2024-01-02")
df = pd.DataFrame({"T" : [T1,T2], "V" : [1,2]})

# 添加最后一个日期的下一天0点的空行
last_date = df['T'].iloc[-1] + pd.Timedelta(days=1)
df = pd.concat([df, pd.DataFrame({"T": [last_date], "V": [np.nan]})])

# 重采样填充并删除最后一行
df = (df 
        .set_index("T")
        .resample("h")
        .ffill()
        .iloc[:-1])

print(df.shape)  # 输出 (48, 1),符合预期

方法2:手动构建完整小时索引

直接生成从第一个日期到最后一个日期23点的所有小时索引,再通过reindex和ffill完成填充:

import pandas as pd

T1 = pd.Timestamp("2024-01-01")
T2 = pd.Timestamp("2024-01-02")
df = pd.DataFrame({"T" : [T1,T2], "V" : [1,2]})

# 构建完整的小时时间序列
start = df['T'].iloc[0]
end = df['T'].iloc[-1] + pd.Timedelta(hours=23)
hourly_index = pd.date_range(start=start, end=end, freq='h')

# 重索引并填充
df = (df
        .set_index("T")
        .reindex(hourly_index)
        .ffill())

print(df.shape)  # 输出 (48, 1),符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:43:19