使用遗漏日期的向前填充为每个ID添加每日数据

opt*_*ime 3 python date pandas

我有一个熊猫数据框,如下所示:

    id   date    value  name
0   C1  2017-01-01  31  Company 1
1   C1  2017-01-02  35  Company 1
2   C1  2017-01-03  32  Company 1
3   C1  2017-01-06  36  Company 1
4   C1  2017-01-07  35  Company 1
5   C1  2017-01-08  34  Company 1
6   C1  2017-01-10  33  Company 1
7   C2  2017-01-01  225 Company 2
8   C2  2017-01-02  223 Company 2
9   C2  2017-01-03  223 Company 2
10  C2  2017-01-06  220 Company 2
11  C2  2017-01-07  222 Company 2
12  C2  2017-01-08  225 Company 2
13  C2  2017-01-10  224 Company 2
14  C3  2017-01-08  340 Company 3
Run Code Online (Sandbox Code Playgroud)

对于此数据框,日期范围为开始日期2017-01-01结束日期2017-01-10(包括两者)。那就是所有数据都在这两个日期之间。

我想为缺少的日期添加新行。例如,对于id C1,在2017-01-04,2017-01-05,2017-01-09value列中缺少值,应按如下所示在value列中添加新行,并添加0

 C1 2017-01-04 0 Company1
 C1 2017-01-05 0 Company1
 C1 2017-01-09 0 Company1
Run Code Online (Sandbox Code Playgroud)

类似地,对于C2,存在缺少的值2017-01-04,2017-01-05,2017-01-09C3有缺失值2017年1月1日至2017年1月7日和2017-01-09,2017-01-10

我正在努力找出如何执行使用熊猫添加这些行的操作。因此,只是寻求一些帮助。

Psi*_*dom 5

一种选择是创建要使用的所有日期pandas.date_range,然后可以在完整日期之间进行外部联接,并在日期列上键入每个子数据框,最后用0填充缺失值:

# create complete dates
dates = pd.DataFrame({"date": pd.date_range("2017-01-01", "2017-01-10")})

# convert date column to date time if it's not already
df['date'] = pd.to_datetime(df.date)

# merge complete dates with each sub data frame separately using groupby.apply
(df.groupby(['id', 'name'])['date', 'value']
 .apply(lambda g: g.merge(dates, how="outer"))
 .fillna(0)
 .reset_index(level=[0,1])
 .reset_index(drop=True))

#   id       name        date   value
#0  C1  Company 1   2017-01-01  31.0
#1  C1  Company 1   2017-01-02  35.0
#2  C1  Company 1   2017-01-03  32.0
#3  C1  Company 1   2017-01-06  36.0
#4  C1  Company 1   2017-01-07  35.0
#5  C1  Company 1   2017-01-08  34.0
#6  C1  Company 1   2017-01-10  33.0
#7  C1  Company 1   2017-01-04  0.0
#8  C1  Company 1   2017-01-05  0.0
#9  C1  Company 1   2017-01-09  0.0
# ...
Run Code Online (Sandbox Code Playgroud)