如何为数据框中每个组的特定时间范围重新采样时间序列?

How to resample a Time Series for a specific timerange for each group in a dataframe?

我有以下数据框:

date group value1 value2
2020-01-01 A 12 2
2020-02-01 A 11 4
2020-03-01 A 7 5
2020-04-01 A 23 3
2020-03-01 B 66 1
2020-04-01 B 61 8
2020-06-01 B 55 8
2020-04-01 C 3 0
2020-06-01 C 22 112
... ... ... ...

我可以在每组日期之间填写缺失的日期:

df.set_index('date').groupby('group').resample('MS').asfreq().drop(['group'], 1).reset_index()

但我想填写特定时间范围内每组的所有日期(例如 2020-01-01 至 2020-06-01)。

所以结果看起来像这样:

date group value1 value2
2020-01-01 A 12 2
2020-02-01 A 11 4
2020-03-01 A 7 5
2020-04-01 A 23 3
2020-05-01 A 0 0
2020-06-01 A 0 0
2020-01-01 B 0 0
2020-02-01 B 0 0
2020-03-01 B 66 1
2020-04-01 B 61 8
2020-05-01 B 0 0
2020-06-01 B 55 8
... ... ... ...

一个选择是遵循这个 并创建一个函数,然后 apply 它到每个组。您可以设置日期向量以用于重建索引,并将其放入将应用于每个组的函数中:

START = '01-01-2020'
END = '06-01-2020'
DATE_RANGE = pd.date_range(START, END, freq='MS')

def apply_reindex(df):
    reindexed = df.set_index('date').reindex(DATE_RANGE)
    filled = reindexed.fillna({'group':df.name, 'value1':0, 'value2':0})
    filled.index.name = 'date'
    filled = filled.reset_index()
    return filled

有一些烦人的索引 setting/renaming 东西可以在 date 列上调用重新索引,然后 return 它成为一个列。

然后您可以调用该函数:

df.groupby('group').apply(apply_reindex).reset_index(drop=True)

产生:

        date group  value1  value2
0  2020-01-01     A    12.0     2.0
1  2020-02-01     A    11.0     4.0
2  2020-03-01     A     7.0     5.0
3  2020-04-01     A    23.0     3.0
4  2020-05-01     A     0.0     0.0
5  2020-06-01     A     0.0     0.0
6  2020-01-01     B     0.0     0.0
7  2020-02-01     B     0.0     0.0
8  2020-03-01     B    66.0     1.0
9  2020-04-01     B    61.0     8.0
10 2020-05-01     B     0.0     0.0
11 2020-06-01     B    55.0     8.0
12 2020-01-01     C     0.0     0.0
13 2020-02-01     C     0.0     0.0
14 2020-03-01     C     0.0     0.0
15 2020-04-01     C     3.0     0.0
16 2020-05-01     C     0.0     0.0
17 2020-06-01     C    22.0   112.0