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

