我正在使用两个 pandas 数据框,我试图按相同的日期范围对其进行分组。我想使用这个我们可以称之为“小时”的示例 df 作为设置 START_DATE 和 END_DATE 的基础,我可以通过按索引按每 5 条记录进行分组来做到这一点。这是“小时”数据框的样子:
HOURS MIN_DATE MAX_DATE
0 93.00 2021-01-05 2021-01-12
1 203.25 2021-01-13 2021-01-19
2 210.00 2021-01-20 2021-01-26
3 185.75 2021-01-27 2021-02-02
4 180.25 2021-02-03 2021-02-09
5 172.25 2021-02-10 2021-02-16
然后我有一个单独的 df,我想用相同的日期范围进行总结,我称之为“模型”,如下所示:
MODEL DATE MODEL_1 MODEL_2 MODEL_3 MODEL_4 MODEL_5 MODEL_6
0 2021-01-05 0 2 0 0 0 0
1 2021-01-06 0 0 0 0 3 0
2 2021-01-07 0 0 0 0 0 0
3 2021-01-13 3 0 0 0 0 0
4 2021-01-14 0 0 1 1 1 0
5 2021-01-15 0 0 0 0 0 0
6 2021-01-20 0 0 0 0 0 1
7 2021-01-21 0 3 0 0 0 1
我最终要寻找的是这个结果:
MIN_DATE MAX_DATE MODEL_1 MODEL_2 MODEL_3 MODEL_4 MODEL_5 MODEL_6
0 2021-01-05 2021-01-12 0 2 0 0 3 0
1 2021-01-13 2021-01-19 3 0 1 1 1 0
2 2021-01-20 2021-01-26 0 3 0 0 0 2
我一直无法找到一种方法来使用“小时”数据中的 MIN_DATE 和 MAX_DATE 对“模型”数据使用 .groupby()。我应该使用其他操作还是有办法使用这些日期来汇总模型数据?
谢谢
最佳答案
尝试使用 pd.IntervalIndex
和 groupby
:
# First let's ensure that all DATE columns are datetime dtype:
hours_df[['MIN_DATE', 'MAX_DATE']] = hours_df[['MIN_DATE', 'MAX_DATE']].apply(pd.to_datetime)
model_df['DATE'] = pd.to_datetime(model_df['DATE'])
# Create IntervalIndex using from_arrays
hours_df['interval'] = pd.IntervalIndex.from_arrays(hours_df['MIN_DATE'], hours_df['MAX_DATE'], closed='both')
#set 'interval' as index of hours_df
hours_df = hours_df.set_index('interval')
# groupby and sum
model_df.groupby(hours_df.loc[model_df['DATE']].index).sum()
输出:
MODEL_1 MODEL_2 MODEL_3 MODEL_4 MODEL_5 MODEL_6
interval
[2021-01-05, 2021-01-12] 0 2 0 0 3 0
[2021-01-13, 2021-01-19] 3 0 1 1 1 0
[2021-01-20, 2021-01-26] 0 3 0 0 0 2
关于python - 根据指定的 START_DATE 和 END_DATE 从单独的 df 对 Pandas df 进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68682201/