如何在Pandas中按小时拆分数据并按比例分配指标
按小时粒度拆分时序数据并按比例分配字段的实现方法
你的问题核心是要把跨小时的生产记录拆分到对应的每个小时区间,并按实际时长占比分配Duration和PartsProduced,直接用resample('H').sum()只会把整条记录归到StartTime所在的小时,无法处理跨小时拆分和比例分配,以下是可行的实现步骤:
实现代码
import pandas as pd # 假设原始数据已加载为DataFrame,先把StartTime从索引转为列并统一时间格式 df = df.reset_index() df['StartTime'] = pd.to_datetime(df['StartTime']) df['EndTime'] = pd.to_datetime(df['EndTime']) # 为每条记录生成其覆盖的所有整点小时区间 df['hour_ranges'] = df.apply( lambda row: pd.date_range( start=row['StartTime'].floor('H'), end=row['EndTime'].floor('H'), freq='H' ), axis=1 ) # 将每个小时区间展开为单独的行 expanded_df = df.explode('hour_ranges').rename(columns={'hour_ranges': 'Hourly_DateTime'}) # 计算当前记录在对应小时内的实际持续时长(秒) def calculate_hourly_duration(row): hour_start = row['Hourly_DateTime'] hour_end = hour_start + pd.Timedelta(hours=1) actual_start = max(row['StartTime'], hour_start) actual_end = min(row['EndTime'], hour_end) return (actual_end - actual_start).total_seconds() expanded_df['hourly_duration'] = expanded_df.apply(calculate_hourly_duration, axis=1) # 按时长占比分配PartsProduced字段 expanded_df['hourly_parts'] = expanded_df.apply( lambda row: row['PartsProduced'] * (row['hourly_duration'] / row['Duration']), axis=1 ) # 按小时聚合求和并取整,匹配目标结果的整数格式 final_result = expanded_df.groupby('Hourly_DateTime').agg( Duration=('hourly_duration', lambda x: round(x.sum())), PartsProduced=('hourly_parts', lambda x: round(x.sum())) ).reset_index() print(final_result)
代码说明
- 时间格式统一:确保
StartTime和EndTime为datetime类型,为后续时间计算提供基础 - 生成覆盖小时区间:为每条跨小时的记录,生成它所覆盖的所有整点小时起始时间
- 拆分多行数据:把一条跨小时记录拆成对应每个覆盖小时的多行,便于按小时维度计算
- 计算小时内实际时长:针对拆分后的每一行,精准计算该记录在对应小时内的实际运行秒数
- 比例分配产量:用小时内实际时长占总时长的比例,计算该小时应分配的产量
- 小时聚合求和:按小时分组,把同一小时的拆分结果求和并取整,得到目标格式的结果
内容的提问来源于stack exchange,提问作者PKD
相关产品推荐
相关产品推荐

