Skip to main content
 首页 » 编程设计

python Pandas : Inserting new rows for date gaps in data

2025年05月04日15lvdongjie

我有这样的 Pandas 数据框

Date      Curr    Amount 
1/1/2015  USD 100.00 
1/2/2015  USD 125.00 
1/5/2015  USD 110.00 
1/6/2015  USD 115.00 
 
1/1/2015  AUD 100.00 
1/2/2015  AUD 125.00 
1/5/2015  AUD  110.00 
1/6/2015  AUD 115.00 

期望的输出

    Date  curr  Amount 
1/1/2015  usd 100.00 
1/2/2015  usd 125.00 
1/3/2015  usd 125.00 
1/4/2015  usd 125.00 
1/5/2015  usd 110.00 
1/6/2015  usd 115.00 
1/1/2015  aud 100.00 
1/2/2015  aud 125.00 
1/3/2015  aud 125.00 
1/4/2015  aud 125.00 
1/5/2015  aud 110.00 
1/6/2015  aud 115.00 

源数据只记录了金额的变化,我想插入缺失的日期以及跳过前的金额。

在我的示例中,它从 1/2 跳到 1/5。我希望使用 1/2 金额填写金额列,并为缺失的日期创建 3 行。

谢谢

请您参考如下方法:

一个很长的两个衬里应该被打破:

idx = pd.DatetimeIndex(start=min(df.Date), end=max(df.Date), freq='D') 
df2 = (pd.DataFrame(df.set_index(['Date', 'Curr']).unstack('Curr'), index=idx).fillna(0)  
+ df.set_index(['Date', 'Curr']).unstack('Curr')).ffill().stack() 
>>> df2 
                 Amount 
           Curr         
2015-01-01 AUD      100 
           USD      100 
2015-01-02 AUD      125 
           USD      125 
2015-01-03 AUD      125 
           USD      125 
2015-01-04 AUD      125 
           USD      125 
2015-01-05 AUD      110 
           USD      110 
2015-01-06 AUD      115 
           USD      115 

仔细观察,我首先使用原始 DataFrame 中的最小和最大日期创建了一个 DatetimeIndex。我将频率设置为每日 ('D'),但您可能想使用另一个 offset frequency例如工作日 ('B'):

idx = pd.DatetimeIndex(start=min(df.Date), end=max(df.Date), freq='D') 

然后我取消堆叠 DataFrame,以便索引中只有日期。

df_temp = df.set_index(['Date', 'Curr']).unstack('Curr') 
 
>>> df_temp 
          Amount      
Curr         AUD  USD 
Date                  
1/1/2015     100  100 
1/2/2015     125  125 
1/5/2015     110  110 
1/6/2015     115  115 

我创建了一个临时的 DataFrame,它将全部为 NaN,但包含我新的扩展日期列表。我用零填充这个 DataFrame 并用 df_temp 中的值覆盖它:

df_temp2 = (pd.DataFrame(df_temp, index=idx).fillna(0) + df_temp) 
 
>>> df_temp2 
            Amount      
Curr           AUD  USD 
2015-01-01     100  100 
2015-01-02     125  125 
2015-01-03     NaN  NaN 
2015-01-04     NaN  NaN 
2015-01-05     110  110 
2015-01-06     115  115 

最后,我向前填充值以移除 NaN,并堆叠货币:

>>> df_temp2.ffill().stack()  
                 Amount 
           Curr         
2015-01-01 AUD      100 
           USD      100 
2015-01-02 AUD      125 
           USD      125 
2015-01-03 AUD      125 
           USD      125 
2015-01-04 AUD      125 
           USD      125 
2015-01-05 AUD      110 
           USD      110 
2015-01-06 AUD      115 
           USD      115