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

Python基于DatetimeIndex年月匹配实现两个DataFrame对应列乘法

实现方案

不需要手动遍历DatetimeIndex,直接用pandas向量化操作即可实现,以下是两种可行写法:

写法1:简洁高效版(推荐)

利用周期索引重索引+广播运算,代码量少且执行效率高:

import pandas as pd

# 先确保两个df的索引都是Datetime格式
df1.index = pd.to_datetime(df1.index, format='%d/%m/%Y')
df2.index = pd.to_datetime(df2.index, format='%d/%m/%Y')

# 生成与df1行数一致的系数表,每行对应对应年月的df2数值
coef_df = df2.set_index(df2.index.to_period('M')).reindex(df1.index.to_period('M')).set_index(df1.index)

# 直接对应列相乘得到结果
df3 = df1 * coef_df

写法2:逻辑清晰版(适合新手)

用合并表的方式实现,每一步逻辑可追溯:

import pandas as pd

df1.index = pd.to_datetime(df1.index, format='%d/%m/%Y')
df2.index = pd.to_datetime(df2.index, format='%d/%m/%Y')

# 分别给两个表添加年月辅助列
df1['ym'] = df1.index.to_period('M')
df2['ym'] = df2.index.to_period('M')

# 按年月列合并两个表
merge_df = df1.merge(df2, on='ym', suffixes=('_raw', '_coef')).set_index(df1.index)

# 对应列相乘得到结果
df3 = pd.DataFrame({
    'A': merge_df['A_raw'] * merge_df['A_coef'],
    'B': merge_df['B_raw'] * merge_df['B_coef']
})

注意事项

  • 如果df2同一个年月存在多条记录,需要先对df2按年月聚合后再匹配,聚合逻辑可以根据需求选择first()(取第一条)、mean()(取均值)、sum()(求和)等,示例:
    # 同一个年月取均值作为系数
    df2 = df2.groupby(df2.index.to_period('M')).mean()
    
  • 如果df1存在部分年月在df2中没有匹配的情况,相乘结果会返回NaN,可以按需用fillna()填充默认值。

运行上述代码得到的df3和你预期的输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:30:04