如何实现带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')无法实现时长限制,需通过以下步骤完成:
- 预处理数据:将时间戳转为datetime类型并设为索引,生成完整的1分钟频率时间轴
- 标记填充截止时间:为每个原始数据点计算填充的最晚时间(当前时间+24小时,与下一个数据点时间取较小值)
- 按限制填充:仅在截止时间范围内执行前向填充,超出范围保留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
相关产品推荐
相关产品推荐

