基于现有DataFrame的日期范围和数值生成周期性费用新DataFrame
实现方案
前置说明
首先请确保你原始费用表的两个日期字段已经转换为Pandas datetime类型,若未转换可先执行以下代码:
import pandas as pd import datetime # 转换日期字段格式 fee_df['purchase_date'] = pd.to_datetime(fee_df['purchase_date']) fee_df['date_terminated'] = pd.to_datetime(fee_df['date_terminated'])
其中fee_df为你存储周期性费用的原始DataFrame,dates_list为你给定的统计日期列表。
核心实现代码
# 1. 构造结果表的索引 stats_index = pd.DatetimeIndex(dates_list) # 2. 初始化结果表,初始值全为NaN result_df = pd.DataFrame( index=stats_index, columns=fee_df['id'].unique(), dtype='float' ) # 3. 逐行匹配费用生效区间填充价格 for _, fee_info in fee_df.iterrows(): fee_id = fee_info['id'] price = fee_info['price'] start_date = fee_info['purchase_date'] end_date = fee_info['date_terminated'] # 构造生效日期掩码 valid_mask = (result_df.index >= start_date) # 有终止日期的需要额外判断小于终止日期 if pd.notna(end_date): valid_mask &= (result_df.index < end_date) # 填充对应位置的价格 result_df.loc[valid_mask, fee_id] = price
逻辑说明
填充规则完全匹配你的需求:
- 统计日期早于费用的
purchase_date:留空(NaN) - 统计日期在
purchase_date之后,且费用无终止日期(date_terminated为NaT):一直填充对应价格 - 统计日期在
purchase_date之后、早于date_terminated:填充对应价格 - 统计日期晚于等于
date_terminated:留空(NaN)
最终得到的result_df就是你需要的格式。
内容的提问来源于stack exchange,提问作者b104
相关产品推荐
相关产品推荐

