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

使用Python将能耗时段数据转换为小时级能耗时间序列

按小时统计能耗时间序列的Pandas实现方法

需求说明

现有包含start、end时间戳、时长及能耗值的DataFrame,需转换为按小时统计能耗的时间序列,输入和预期输出如下:

输入DataFrame样本:

start                    end        time   energy
0     2024-03-30 22:01:25    2024-03-31 12:29:07    00:18:21     2.18
1     2024-03-30 19:56:42    2024-03-30 22:00:23    02:03:36    14.79
2     2024-03-30 19:49:00    2024-03-30 19:56:40    00:07:37     0.89

预期输出:

time  energy
0     2024-03-31 00:00:00     0.0
1     2024-03-30 23:00:00     0.0
2     2024-03-30 22:00:00    2.23
3     2024-03-30 21:00:00    7.18
4     2024-03-30 20:00:00    7.18
5     2024-03-30 19:00:00    1.28

实现步骤

1. 转换时间列类型

首先将start和end列转换为datetime格式,这是后续时间计算的基础:

import pandas as pd

# 假设原始数据存储在df变量中
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

2. 展开每条记录的小时区间

对每条记录,生成它跨越的所有整点小时,并计算每个小时内的实际持续时长:

def expand_hours(row):
    # 生成当前记录覆盖的所有整点小时
    hours = pd.date_range(
        start=row['start'].floor('H'),
        end=row['end'].floor('H'),
        freq='H'
    )
    # 计算每个小时内的有效持续秒数
    durations = []
    for hour in hours:
        hour_start = hour
        hour_end = hour + pd.Timedelta(hours=1)
        # 取记录时间与小时区间的交集
        segment_start = max(row['start'], hour_start)
        segment_end = min(row['end'], hour_end)
        durations.append((segment_end - segment_start).total_seconds())
    
    return pd.DataFrame({
        'time': hours,
        'duration': durations,
        'total_energy': row['energy'],
        'total_duration': (row['end'] - row['start']).total_seconds()
    })

# 应用函数并合并所有结果
expanded_df = pd.concat([expand_hours(row) for _, row in df.iterrows()], ignore_index=True)

3. 计算单小时能耗

根据每个小时的时长占记录总时长的比例,分配能耗:

# 按比例计算每个小时的能耗
expanded_df['energy'] = expanded_df['total_energy'] * (expanded_df['duration'] / expanded_df['total_duration'])

# 按小时分组求和,得到每个小时的总能耗
hourly_energy = expanded_df.groupby('time')['energy'].sum().reset_index()

4. 补全缺失小时的0值

生成完整的时间区间,将没有能耗的小时填充为0,并调整排序:

# 确定完整的时间范围
min_time = df['start'].floor('H').min()
max_time = df['end'].floor('H').max()
full_time_range = pd.date_range(start=min_time, end=max_time, freq='H')

# 合并完整时间序列,缺失值填充0
full_hourly_energy = pd.DataFrame({'time': full_time_range}).merge(
    hourly_energy, on='time', how='left'
).fillna(0)

# 按时间降序排列,和示例输出一致
full_hourly_energy = full_hourly_energy.sort_values('time', ascending=False).reset_index(drop=True)

# 保留两位小数,匹配示例格式
full_hourly_energy['energy'] = full_hourly_energy['energy'].round(2)

5. 查看最终结果

运行以下代码即可得到预期输出:

print(full_hourly_energy)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:56:09