<p>您可以按custid对Dataframe进行分组,并创建具有所需日期范围的索引。现在使用这个索引来重新索引数据</p>
<pre><code>df['UsageDate'] = pd.to_datetime(df['UsageDate'])
idx = df.groupby('CustID')['UsageDate'].apply(lambda x: pd.Series(index = pd.date_range(x.min(), x.max(), freq = 'H'))).index
df.set_index(['CustID', 'UsageDate']).reindex(idx).fillna(0).reset_index().rename(columns = {'level_1':'UsageDate'})
CustID UsageDate EnergyConsumed
0 17111 2018-01-01 00:00:00 1.095
1 17111 2018-01-01 01:00:00 1.129
2 17111 2018-01-01 02:00:00 1.165
3 17111 2018-01-01 03:00:00 1.833
4 17111 2018-01-01 04:00:00 1.697
5 17111 2018-01-01 05:00:00 1.835
6 17111 2018-01-01 06:00:00 0.000
7 17111 2018-01-01 07:00:00 1.835
8 17112 2018-01-01 00:00:00 1.095
9 17112 2018-01-01 01:00:00 1.129
10 17112 2018-01-01 02:00:00 0.000
11 17112 2018-01-01 03:00:00 1.833
12 17112 2018-01-01 04:00:00 1.697
13 17112 2018-01-01 05:00:00 1.835
</code></pre>
<p>说明:由于Usagedates必须是该CustID的最小和最大日期范围内的所有日期,因此我们按CustID对数据进行分组,并使用date\u range创建一系列最小和最大日期。将日期设置为系列的索引,而不是值。groupby的结果将是一个多索引,CUSTID为级别0,usage date为级别1。我们现在使用这个多索引来重新索引原始数据帧。它将使用索引匹配的值,在其余部分赋值为NaN。最后使用fillna将NaN转换为0。你知道吗</p>