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

如何在15天时间限制下按公司填充bond_yield列缺失值?

带时间限制的缺失值前向填充实现

我有一组数据,其中bond_yield列存在大量缺失值。此前已实现按公司分组后用前向填充(ffill)的方式填充缺失值,代码如下:

#先按公司和时间排序数据
df_dataset = df_dataset.sort_values(by=['gvkey','date'])

#按公司分组填充bond_yield的缺失值,避免跨公司填充
df_dataset['bond_yield']= df_dataset.groupby('gvkey')['bond_yield'].fillna(method='ffill')

df_dataset.head()

    company gvkey   date    market_cds_spread   bond_yield  
34315   AMCN.AIRLNS.GP.INC  1045    20040101    NaN NaN
34316   AMCN.AIRLNS.GP.INC  1045    20040102    NaN NaN
34317   AMCN.AIRLNS.GP.INC  1045    20040105    NaN NaN
34318   AMCN.AIRLNS.GP.INC  1045    20040106    NaN NaN
34319   AMCN.AIRLNS.GP.INC  1045    20040107    NaN NaN

(注:前几行均为NaN,但后续行有有效值。)

现在需要实现带时间限制的填充:仅当缺失值对应的前一个有效bond_yield数据的日期与当前日期间隔不超过15天时,才用该值填充缺失值。尝试过isnull().sum(),但该方法仅统计缺失值总数,无法计算当前行到前一个有效值的日期间隔,请问如何实现这一15天限制下的缺失值填充?

解决方案

要实现带15天时间限制的前向填充,需要先处理日期格式,再分组追踪前一个有效值的日期,最后根据日期间隔筛选填充结果,具体步骤如下:

1. 转换日期列格式

首先将整数格式的date列转换为datetime类型,方便后续计算日期间隔:

import pandas as pd

# 转换日期列格式
df_dataset['date'] = pd.to_datetime(df_dataset['date'], format='%Y%m%d')
# 确保数据按公司和日期排序
df_dataset = df_dataset.sort_values(by=['gvkey', 'date'])

2. 分组追踪前一个有效值的信息

按公司分组,标记每个有效bond_yield的分组,同时向前填充有效值的日期和bond_yield值:

# 按公司分组,创建有效值的分组标记(非NaN值为新组)
df_dataset['yield_group'] = df_dataset.groupby('gvkey')['bond_yield'].apply(lambda x: x.notna().cumsum())

# 按公司和yield_group分组,填充前一个有效值的日期和bond_yield
df_dataset['prev_yield_date'] = df_dataset.groupby(['gvkey', 'yield_group'])['date'].transform('first')
df_dataset['filled_bond_yield'] = df_dataset.groupby(['gvkey', 'yield_group'])['bond_yield'].transform('first')

3. 计算日期间隔并筛选填充结果

计算当前日期与前一个有效值日期的间隔天数,仅保留间隔≤15天的填充值,否则设为NaN:

# 计算日期间隔天数
df_dataset['days_diff'] = (df_dataset['date'] - df_dataset['prev_yield_date']).dt.days

# 根据间隔天数筛选填充结果:间隔≤15天则用填充值,否则保留NaN
df_dataset['bond_yield'] = df_dataset.apply(
    lambda row: row['filled_bond_yield'] if (row['days_diff'] <= 15 and not pd.isna(row['filled_bond_yield'])) else row['bond_yield'],
    axis=1
)

# 清理临时列(可选)
df_dataset = df_dataset.drop(['yield_group', 'prev_yield_date', 'filled_bond_yield', 'days_diff'], axis=1)

代码说明

  • yield_group:通过cumsum()给每个连续的缺失值段分配同一个组号,确保每个组对应同一个前向有效值。
  • prev_yield_date:记录当前组对应的前一个有效值的日期。
  • days_diff:计算当前行日期与前一个有效值日期的间隔,仅当间隔≤15天时才保留填充值,否则恢复为原有的NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:35:32