使用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
相关产品推荐
相关产品推荐

