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

如何实现带24小时限制的1分钟频率时间序列前向填充?

带24小时限制的时间序列前向填充实现

需求说明

将带时间戳的数据集转换为1分钟频率的时间序列,使用最后输入的值填充新增行的缺失值,但限制填充时长不超过24小时(1440分钟):若两个原始数据点间隔超过24小时,仅填充前1440分钟的缺失值,之后的位置保留NaN。

原始数据集

timestamp           pay
2020-10-10 23:32    50
2020-10-11 21:55    80
2020-10-13 23:28    40  

实现方法

直接使用asfreq('1Min', method='ffill')无法实现时长限制,需通过以下步骤完成:

  1. 预处理数据:将时间戳转为datetime类型并设为索引,生成完整的1分钟频率时间轴
  2. 标记填充截止时间:为每个原始数据点计算填充的最晚时间(当前时间+24小时,与下一个数据点时间取较小值)
  3. 按限制填充:仅在截止时间范围内执行前向填充,超出范围保留NaN

完整代码

import pandas as pd

# 1. 读取并预处理原始数据
data = {
    'timestamp': ['2020-10-10 23:32', '2020-10-11 21:55', '2020-10-13 23:28'],
    'pay': [50, 80, 40]
}
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp')

# 2. 生成覆盖全时间段的1分钟频率时间序列
full_time_index = pd.date_range(start=df.index.min(), end=df.index.max(), freq='1Min')
df_full = df.reindex(full_time_index)

# 3. 计算每个原始数据点的填充截止时间
# 获取下一个原始数据点的时间
df['next_timestamp'] = df.index.shift(-1)
# 计算当前时间+24小时的理论截止时间
df['fill_deadline'] = df.index + pd.Timedelta(hours=24)
# 取"下一个数据点时间"和"当前+24小时"的较小值作为实际填充截止时间
df['fill_deadline'] = df[['next_timestamp', 'fill_deadline']].min(axis=1)

# 4. 将截止时间映射到完整时间序列并向前填充
df_full['fill_deadline'] = df['fill_deadline'].reindex(full_time_index).ffill()

# 5. 仅在允许的时间范围内执行前向填充
df_full['pay_filled'] = df_full['pay'].where(df_full.index <= df_full['fill_deadline'], pd.NA).ffill()

# 查看关键区间的填充结果
print(df_full.loc['2020-10-12 21:54':'2020-10-12 21:56'])
print(df_full.loc['2020-10-13 23:27':'2020-10-13 23:29'])

代码说明

  • 通过reindex生成完整时间轴后,得到带NaN的初始序列
  • 计算fill_deadline确保填充既不超过24小时,也不会覆盖下一个原始数据点
  • 用where过滤出允许填充的区间,再执行ffill,超出区间的位置保留NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:40:29