如何为数据框中每个组的特定时间范围重新采样时间序列?
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
我有以下数据框:
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