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

Pandas:基于日期筛选遍历DataFrame并实现加权求和计算

解决方案:基于Pandas实现日期范围筛选后的乘积求和

我来帮你搞定这个需求!下面是两种实用的实现方式,都基于Pandas库,你可以根据数据量大小选择合适的方法:

前提准备:确保日期列是datetime类型

首先要把df1的Date列,以及df2的mindate、maxdate列转换为datetime格式,否则日期比较会出错:

import pandas as pd

# 转换df1的日期列
df1['Date'] = pd.to_datetime(df1['Date'])
# 转换df2的日期列
df2[['mindate', 'maxdate']] = df2[['mindate', 'maxdate']].apply(pd.to_datetime)

方法一:逐行遍历(直观易懂,适合小数据量)

用apply函数逐行处理df2,每行中筛选出df1对应日期范围的Value,计算乘积后求和:

# 定义处理单一行的函数
def compute_row_total(row):
    # 构建日期范围筛选条件
    date_mask = (df1['Date'] >= row['mindate']) & (df1['Date'] <= row['maxdate'])
    # 获取符合条件的Value
    filtered_values = df1.loc[date_mask, 'Value']
    # 计算乘积之和并返回
    return (filtered_values * row['value']).sum()

# 给df2新增Total列,存储每行的计算结果
df2['Total'] = df2.apply(compute_row_total, axis=1)

这个方法逻辑直白,容易理解,但如果df2的行数很多(比如上万行),性能会稍差,这时候可以试试下面的高效方法。

方法二:合并+分组求和(性能更优,适合大数据量)

通过交叉合并、筛选、分组的方式,避免逐行遍历,提升处理速度:

# 给df2添加一个唯一标识列,用于后续分组
df2['row_id'] = df2.index

# 交叉合并df1和df2,得到所有可能的行组合
merged_df = pd.merge(df1.assign(join_key=1), df2.assign(join_key=1), on='join_key').drop('join_key', axis=1)

# 筛选出符合日期范围的行
valid_rows = merged_df[(merged_df['Date'] >= merged_df['mindate']) & (merged_df['Date'] <= merged_df['maxdate'])]

# 按df2的行标识分组,计算每组的乘积之和
sum_results = valid_rows.groupby('row_id').apply(
    lambda group: (group['Value'] * group['value']).sum()
).reset_index(name='Total')

# 将结果合并回原df2,并移除临时标识列
df2 = df2.merge(sum_results, on='row_id').drop('row_id', axis=1)

测试示例

假设你的df2示例数据如下:

df2 = pd.DataFrame({
    'mindate': ['2012-04-01', '2012-04-03'],
    'maxdate': ['2012-04-02', '2012-04-05'],
    'value': [100, 200]
})

运行上述代码后,df2的Total列会得到:

  • 第一行:(0.00275 + 0.00278) * 100 = 0.553
  • 第二行:(0.00369 + 0.00268 + 0.004) * 200 = 2.074

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:35:23