Skip to main content
 首页 » 编程设计

python之如何填写 Pandas 数据框中的任意缺失日期

2025年05月04日16haluo1

我当前的数据框:

   |   user  |       date        | count| 
   | ------  | ------------------| -----| 
   | user 1  | 2017-11-09        |   3  | 
   | user 1  | 2017-11-12        |   4  | 
   | user 1  | 2017-11-14        |   5  | 
   | user 2  | 2017-11-11        |   2  | 
   | user 2  | 2017-11-12        |   6  | 
   | user 2  | 2017-11-14        |   7  | 

我希望它是什么:

   |   user  |       date        | count| 
   | ------  | ------------------| -----| 
   | user 1  | 2017-11-09        |   3  | 
   | user 1  | 2017-11-10        |   0  | 
   | user 1  | 2017-11-11        |   0  | 
   | user 1  | 2017-11-12        |   4  | 
   | user 1  | 2017-11-13        |   0  |  
   | user 1  | 2017-11-14        |   5  | 
   | user 2  | 2017-11-09        |   0  | 
   | user 2  | 2017-11-10        |   0  | 
   | user 2  | 2017-11-11        |   2  | 
   | user 2  | 2017-11-12        |   6  | 
   | user 2  | 2017-11-13        |   0  |  
   | user 2  | 2017-11-14        |   7  | 

有什么建议吗?我尝试过重新采样方法,但我不确定它是否有效。此外,我的日期已经转换为日期时间对象。

编辑:我很感谢您的回答,但我意识到我的日期列有多个相同的日期,现在索引它是一个问题,因为有重复的日期。有没有办法解决不需要索引(或绕过它?)的问题

请您参考如下方法:

使用asfreq使用 DatetimeIndex,所以首先 set_index :

#if necessary convert to datetimes 
#df['date'] = pd.to_datetime(df['date']) 
 
df = df.set_index('date').asfreq('d', fill_value=0) 
print (df) 
            count 
date              
2017-11-09      3 
2017-11-10      0 
2017-11-11      0 
2017-11-12      4 
2017-11-13      0 
2017-11-14      5 

如果有重复的DatetimeIndex,则需要resample并使用一些聚合函数,如sum:

df = df.set_index('date').resample('d').sum() 

如果不需要所有日期组合,请编辑:

df = (df.set_index('date').groupby('user')['count'] 
        .apply(lambda x: x.asfreq('d', fill_value=0)) 
        .reset_index()) 
print (df) 
     user       date  count 
0  user 1 2017-11-09      3 
1  user 1 2017-11-10      0 
2  user 1 2017-11-11      0 
3  user 1 2017-11-12      4 
4  user 1 2017-11-13      0 
5  user 1 2017-11-14      5 
6  user 2 2017-11-11      2 
7  user 2 2017-11-12      6 
8  user 2 2017-11-13      0 
9  user 2 2017-11-14      7 

EDIT1 对于所有日期组合:

mux = pd.MultiIndex.from_product([df['user'].unique(), pd.date_range(df['date'].min(), df['date'].max())], 
                                 names=['user','date']) 
df = df.set_index(['user', 'date']).reindex(mux, fill_value=0).reset_index() 
print (df) 
      user       date  count 
0   user 1 2017-11-09      3 
1   user 1 2017-11-10      0 
2   user 1 2017-11-11      0 
3   user 1 2017-11-12      4 
4   user 1 2017-11-13      0 
5   user 1 2017-11-14      5 
6   user 2 2017-11-09      0 
7   user 2 2017-11-10      0 
8   user 2 2017-11-11      2 
9   user 2 2017-11-12      6 
10  user 2 2017-11-13      0 
11  user 2 2017-11-14      7