如何在DataFrame中将月度值转换为日度值(含特殊类别处理)
解决方案
核心调整点
原代码对所有类别的BP、RE字段统一执行了除以当月天数的操作,我们需要针对Quality Parameter类别添加分支逻辑:
- 当
Category为QUALITY PARAMETER(注意原代码做了全大写转换)时,日度值保持月度原值不变 - 其他类别,日度值为月度值除以对应月份的天数
修改后的完整代码
import pandas as pd import numpy as np # 原有的数据转换与日期生成逻辑保留 distillery_excel_data_upper = distillery_excel_data.apply(lambda x: x.astype(pd.StringDtype()).str.upper()) distillery_excel_data_upper['Date'] = pd.to_datetime(distillery_excel_data_upper['Year'] + distillery_excel_data_upper['Month'], format='%Y%B') excel_date = pd.to_datetime(distillery_excel_data_upper['Date']) daywise_excel_data = (distillery_excel_data_upper.assign(Daily=[pd.date_range(*x, freq='D') for x in zip(excel_date, excel_date.add(pd.offsets.MonthEnd()))]).explode("Daily")) daywise_excel_data["BP"] = daywise_excel_data["BP"].apply(pd.to_numeric) daywise_excel_data["RE"] = daywise_excel_data["RE"].apply(pd.to_numeric) # 关键修改:添加类别判断逻辑 # 先计算每个分组的当月天数 daywise_excel_data['month_days'] = daywise_excel_data.groupby(["Date", "Category", "Parameter", "Region", "Factory", "UOM"])['Date'].transform("count") # 对BP、RE字段分别做条件赋值 daywise_excel_data['BP'] = np.where( daywise_excel_data['Category'] == 'QUALITY PARAMETER', daywise_excel_data['BP'], daywise_excel_data['BP'] / daywise_excel_data['month_days'] ) daywise_excel_data['RE'] = np.where( daywise_excel_data['Category'] == 'QUALITY PARAMETER', daywise_excel_data['RE'], daywise_excel_data['RE'] / daywise_excel_data['month_days'] ) # 后续清理与重命名逻辑保留 daywise_excel_data = daywise_excel_data.drop(['Date', 'Year', 'Month', 'month_days'], axis=1) daywise_excel_data.rename(columns={'Daily': 'date'}, inplace=True)
代码说明
- 保留原有逻辑:日期生成、数据类型转换、行展开的部分完全复用原代码,保证基础功能不变
- 新增天数计算:通过
transform("count")获取每个月度分组的天数,也就是对应月份的总天数 - 条件赋值:使用
np.where快速判断类别,对非QUALITY PARAMETER的行执行除法,其余行保持原值 - 清理冗余字段:最后删除临时生成的
month_days字段,保证输出结构简洁
验证结果
- 对于
Production类别(如行0):April有30天,BP=30/30=1,RE=60/30=2,符合期望 - 对于
Quality Parameter类别(如行1):BP=45、RE=20保持原值,所有日期行均一致,符合要求
内容的提问来源于stack exchange,提问作者AbinBenny
相关产品推荐
相关产品推荐

