You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

代码说明

  1. 时间格式统一:确保StartTime和EndTime为datetime类型,为后续时间计算提供基础
  2. 生成覆盖小时区间:为每条跨小时的记录,生成它所覆盖的所有整点小时起始时间
  3. 拆分多行数据:把一条跨小时记录拆成对应每个覆盖小时的多行,便于按小时维度计算
  4. 计算小时内实际时长:针对拆分后的每一行,精准计算该记录在对应小时内的实际运行秒数
  5. 比例分配产量:用小时内实际时长占总时长的比例,计算该小时应分配的产量
  6. 小时聚合求和:按小时分组,把同一小时的拆分结果求和并取整,得到目标格式的结果

内容的提问来源于stack exchange,提问作者PKD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:32:32