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

如何高效将多周期Pandas DataFrame转换为单月度周期?

高效拆分多周期收入为月度数据的Pandas方案

针对你的需求——将跨多个月的周期收入拆分为单月度均分数据,替代低效的逐行循环方案,这里提供两种基于Pandas内置函数的高效实现:

方法一:生成日期序列后Explode(易读性优先)

这种方法逻辑直观,通过为每行生成对应周期内的月度结束日期列表,再用explode展开,适合中小数据集:

import pandas as pd

# 确保日期列转为datetime类型
df['date'] = pd.to_datetime(df['date'])
df['date_to'] = pd.to_datetime(df['date_to'])

# 计算月度均分收入
df['monthly_revenue'] = df['net_revenues'] / df['date_diff']

# 为每行生成周期内的所有月末日期列表
df['month_dates'] = df.apply(
    lambda row: pd.date_range(start=row['date'], end=row['date_to'], freq='M').date,
    axis=1
)

# 展开日期列表并整理结果列
new_df = df.explode('month_dates')[['monthly_revenue', 'month_dates']].rename(
    columns={
        'monthly_revenue': 'new_net_revenues',
        'month_dates': 'new_date'
    }
)

方法二:全向量化操作(性能优先)

完全避免逐行apply,利用repeat和分组计数实现纯向量化计算,速度最快,适合大规模数据集:

import pandas as pd

# 确保日期列转为datetime类型
df['date'] = pd.to_datetime(df['date'])
df['date_to'] = pd.to_datetime(df['date_to'])

# 计算月度均分收入
df['monthly_revenue'] = df['net_revenues'] / df['date_diff']

# 按周期月数重复每行数据
repeated_df = df.loc[df.index.repeat(df['date_diff'])]

# 为每组重复行生成月份偏移量(0到date_diff-1)
repeated_df['month_offset'] = repeated_df.groupby(repeated_df.index).cumcount()

# 计算对应月度的结束日期
repeated_df['new_date'] = (
    repeated_df['date'] + pd.offsets.MonthBegin(repeated_df['month_offset']) 
    + pd.offsets.MonthEnd()
)

# 整理最终结果
new_df = repeated_df[['monthly_revenue', 'new_date']].rename(
    columns={'monthly_revenue': 'new_net_revenues'}
)

方案优势

两种方法均利用Pandas的C级优化内置操作,相比原有的iterrows嵌套循环,性能提升数十倍甚至上百倍:

  • 避免了Python层面的循环开销,完全依托Pandas的向量化计算能力
  • 代码更简洁易维护,无需手动管理行的复制和添加

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:17:11