python - 根据指定的 START_DATE 和 END_DATE 从单独的 df 对 Pandas df 进行分组

标签 python pandas dataframe date-range

我正在使用两个 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.IntervalIndexgroupby:

# 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/

相关文章:

python - 如何使用参数检索挂起和正在执行的 Celery 任务?

python - 从字典中删除重复项

python - 如何在链式操作中引用当前版本的 Pandas 数据框

python - hadoop文件系统打开文件并跳过第一行

python - 相当于 NumPy 中的 `math.remainder`?

python - Pandas future 警告 : Columnar iteration over characters will be deprecated in future releases

python - 从 URL 到 `pandas.DataFrame` 的 Excel 工作簿表

r - 检查列中的数字是否按某个值递增(R 数据帧)

python - 在 pandas 中,如何从字典列表创建数据框?

在 R 中逐行重新排序数据帧的列