如何在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,每日保持该值:
| Date | Category | BP_daily | RE_daily |
|---|---|---|---|
| 2023-01-01 | Quality Parameter | 45 | 60 |
| 2023-01-02 | Quality Parameter | 45 | 60 |
| ... | ... | ... | ... |
| 2023-01-31 | Quality Parameter | 45 | 60 |
| 2023-01-01 | Other Category | 10 | 20 |
| 2023-01-02 | Other Category | 10 | 20 |
| ... | ... | ... | ... |
| 2023-01-31 | Other Category | 10 | 20 |
内容的提问来源于stack exchange,提问作者AbinBenny
相关产品推荐
相关产品推荐

