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

如何基于多重叠日期区间提取每小时聚合Volume值

实现时间段Volume值的小时级累加计算

原始数据

给定的DataFrame如下:

import pandas as pd

df = pd.DataFrame({
    'Start_Date': ['2024-10-01', '2025-01-01', '2025-04-01', '2025-01-01', '2026-01-01'],
    'End_Date': ['2024-12-31', '2025-03-31', '2025-06-30', '2025-12-31', '2026-12-31'],
    'Relevant': [False, True, True, True, False],
    'Volume': [0.0, 0.097989, -0.014449, 0.195327, 0.0]
})

需求说明

已生成Relevant=True范围内的小时级DateTime索引,需要将每个小时落在的所有时间段的Volume值累加:

  • 2025年1-3月的每个小时:0.097989 + 0.195327
  • 2025年4-6月的每个小时:-0.014449 + 0.195327
  • 2025年7-12月的每个小时:仅0.195327

实现方案

方法1:循环遍历(直观易懂)

适合数据量较小的场景,逻辑清晰:

# 转换日期列为datetime类型
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])

# 筛选Relevant=True的行
relevant_df = df[df['Relevant']]
earliest_start = relevant_df['Start_Date'].min()
latest_end = relevant_df['End_Date'].max()

# 创建包含最后一小时的小时级索引
date_range = pd.date_range(start=earliest_start, end=latest_end + pd.Timedelta(hours=23), freq='H')
aggregated_volumes = pd.Series(0.0, index=date_range, dtype=float)

# 遍历每个时间段,累加Volume到对应小时
for _, row in relevant_df.iterrows():
    start_hour = row['Start_Date']
    end_hour = row['End_Date'] + pd.Timedelta(hours=23)
    aggregated_volumes.loc[start_hour:end_hour] += row['Volume']

方法2:向量化操作(高效)

适合大数据量场景,避免循环提升效率:

# 转换日期列为datetime类型
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])

# 筛选Relevant=True的行
relevant_df = df[df['Relevant']]
earliest_start = relevant_df['Start_Date'].min()
latest_end = relevant_df['End_Date'].max()

# 创建包含最后一小时的小时级索引
date_range = pd.date_range(start=earliest_start, end=latest_end + pd.Timedelta(hours=23), freq='H')

# 构建时间段区间索引(左闭右闭)
intervals = pd.IntervalIndex.from_arrays(
    relevant_df['Start_Date'],
    relevant_df['End_Date'] + pd.Timedelta(hours=23),
    closed='both'
)

# 匹配每个小时所属的时间段,并累加对应Volume
hour_to_intervals = date_range.to_series().apply(lambda x: intervals.get_indexer_for([x])).explode()
aggregated_volumes = relevant_df.loc[hour_to_intervals, 'Volume'].groupby(hour_to_intervals.index).sum()

关键说明

  • 转换日期列为datetime类型是后续操作的基础,避免类型不兼容问题
  • 扩展latest_end到当天23点,确保时间段的最后一小时被包含在内
  • 两种方法最终都会生成每个小时的累加Volume值,满足需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:53:12