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

如何在DataFrame中差异化转换月度BP、RE值为日度值

解决方案:月度转日度差异化数值转换

核心思路

先将月度数据展开为每日行,再根据Category字段分两种逻辑计算日度值:

  • Quality Parameter类别:直接沿用月度原值
  • 其他类别:月度值除以对应月份的天数

步骤1:准备测试数据(模拟你的输入)

假设你的原始DataFrame结构如下:

import pandas as pd
import numpy as np

# 模拟输入数据
raw_df = pd.DataFrame({
    'Date': ['2023-01-31', '2023-01-31', '2023-02-28', '2023-02-28'],
    'Category': ['Quality Parameter', 'Other Category', 'Quality Parameter', 'Other Category'],
    'BP': [45, 310, 50, 280],
    'RE': [60, 620, 70, 560]
})
raw_df['Date'] = pd.to_datetime(raw_df['Date'])

步骤2:生成月度日期范围与天数

为每条月度数据添加当月起始日期和当月天数,用于后续生成每日行和数值计算:

# 添加当月起始日期和天数列
raw_df['month_start'] = raw_df['Date'].dt.to_period('M').dt.start_time
raw_df['days_in_month'] = raw_df['Date'].dt.days_in_month

# 生成该月的所有日期列表
raw_df['daily_dates'] = raw_df.apply(
    lambda row: pd.date_range(start=row['month_start'], end=row['Date']),
    axis=1
)

步骤3:展开为每日行并计算日度值

用explode将日期列表展开为单行,再通过numpy.where高效实现差异化计算:

# 展开成每日数据行
daily_df = raw_df.explode('daily_dates').drop(columns=['Date', 'month_start'])

# 分类别计算日度BP、RE值
daily_df['BP_daily'] = np.where(
    daily_df['Category'] == 'Quality Parameter',
    daily_df['BP'],
    daily_df['BP'] / daily_df['days_in_month']
)
daily_df['RE_daily'] = np.where(
    daily_df['Category'] == 'Quality Parameter',
    daily_df['RE'],
    daily_df['RE'] / daily_df['days_in_month']
)

# 整理最终输出格式
daily_df = daily_df.rename(columns={'daily_dates': 'Date'})[['Date', 'Category', 'BP_daily', 'RE_daily']]

最终输出示例

以2023年1月为例,Quality Parameter的BP值每天都是45,Other Category的BP值为310/31=10,每日保持该值:

DateCategoryBP_dailyRE_daily
2023-01-01Quality Parameter4560
2023-01-02Quality Parameter4560
............
2023-01-31Quality Parameter4560
2023-01-01Other Category1020
2023-01-02Other Category1020
............
2023-01-31Other Category1020

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:12:57