如何基于列值将Pandas DataFrame行不均匀分配到时间戳
问题描述
现有一个包含DateTime(时间戳)和Execution(执行次数)列的Pandas DataFrame,示例输入如下:
DateTime Execution 0 2023-04-03 07:00:00 11 1 2023-04-03 11:00:00 1 2 2023-04-03 12:00:00 1 3 2023-04-03 14:00:00 3 4 2023-04-03 18:00:00 1
该DataFrame共有5080行数据。
需求:仅当Execution值大于4时,将多余的执行次数分配到后续的连续小时时间戳中,且每个小时的Execution最大值为4。处理后的期望输出如下:
DateTime Execution 0 2023-04-03 07:00:00 4 1 2023-04-03 08:00:00 4 2 2023-04-03 09:00:00 3 3 2023-04-03 11:00:00 1 4 2023-04-03 12:00:00 1 5 2023-04-03 14:00:00 3 6 2023-04-03 18:00:00 1
此前的均匀分配方案不适用,需实现这种优先填满当前及后续小时(每小时最多4次)的不均匀分配逻辑。
解决方案
可以通过遍历DataFrame,对每个Execution值超过4的行拆分生成新的时间戳和对应执行次数,最后合并所有行得到结果。具体代码实现如下:
import pandas as pd # 确保DateTime列是datetime类型 df['DateTime'] = pd.to_datetime(df['DateTime']) # 初始化空列表存储处理后的行 processed_rows = [] for _, row in df.iterrows(): dt = row['DateTime'] exec_count = row['Execution'] if exec_count <= 4: # 执行次数不超过4,直接保留原行 processed_rows.append({'DateTime': dt, 'Execution': exec_count}) continue # 先给当前时间戳分配4次,计算剩余次数 remaining = exec_count - 4 processed_rows.append({'DateTime': dt, 'Execution': 4}) # 依次将剩余次数分配到后续每小时,每次最多4次 current_dt = dt + pd.Timedelta(hours=1) while remaining > 0: add_num = min(remaining, 4) processed_rows.append({'DateTime': current_dt, 'Execution': add_num}) remaining -= add_num current_dt += pd.Timedelta(hours=1) # 转换为最终结果DataFrame result_df = pd.DataFrame(processed_rows)
代码说明
- 类型校验:先将
DateTime列转换为datetime类型,确保后续时间计算的准确性。 - 分情况处理:
- 若
Execution值≤4,直接保留原始行数据; - 若
Execution值>4,先给当前时间戳分配4次,再将剩余次数按每小时最多4次的规则,依次分配到后续连续的小时时间戳中,直到剩余次数为0。
- 若
- 结果整合:将所有处理后的行数据合并为新的DataFrame,得到符合需求的输出。
内容的提问来源于stack exchange,提问作者GKAK
相关产品推荐
相关产品推荐

