如何基于多重叠日期区间提取每小时聚合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
相关产品推荐
相关产品推荐

