如何用Pandas扩展日期范围并对多组数据进行向前填充?
解决方案
步骤说明
- 转换日期格式:将原始DataFrame的
DATE列转为datetime类型,方便后续日期范围生成和匹配。 - 构建日期映射:按原始日期分组,保存每个日期对应的所有行数据。
- 生成完整日期序列:基于原始数据的最小、最大日期,生成连续的每日日期序列。
- 向前填充行数据:对每个连续日期,匹配最近的、不晚于当前日期的原始日期,复用其对应的行数据并替换为当前日期。
- 格式还原:将结果的
DATE列转回原始的日/月/年字符串格式。
完整代码
import pandas as pd # 构建原始DataFrame data = { 'DATE': ['01/09/2022', '01/09/2022', '01/09/2022', '05/09/2022', '05/09/2022', '07/09/2022'], 'MIN_AMOUNT': [10, 15, 30, 10, 15, 15], 'MAX_AMOUNT': [20, 25, 50, 20, 25, 25], 'MIN_DAY': [1, 4, 7, 1, 4, 4], 'MAX_DAY': [2, 5, 10, 2, 5, 5] } df = pd.DataFrame(data) # 转换DATE列为datetime类型(格式:日/月/年) df['DATE'] = pd.to_datetime(df['DATE'], format='%d/%m/%Y') # 获取排序后的原始唯一日期 original_dates = sorted(df['DATE'].unique()) # 生成完整的连续日期序列 full_date_range = pd.date_range(start=original_dates[0], end=original_dates[-1], freq='D') # 建立原始日期到对应行数据的映射(去掉DATE列,后续统一赋值) date_to_rows = {date: df[df['DATE'] == date].drop('DATE', axis=1) for date in original_dates} # 生成结果列表 result_rows = [] for current_date in full_date_range: # 找到最近的不晚于当前日期的原始日期 matched_date = max(d for d in original_dates if d <= current_date) # 复制对应行数据并替换日期 temp_df = date_to_rows[matched_date].copy() temp_df['DATE'] = current_date result_rows.append(temp_df) # 合并所有结果并重置索引 result_df = pd.concat(result_rows, ignore_index=True) # 将DATE列转回原始字符串格式 result_df['DATE'] = result_df['DATE'].dt.strftime('%d/%m/%Y') # 打印结果(无索引) print(result_df.to_string(index=False))
输出验证
运行代码后,输出结果与期望格式完全一致,自动填充缺失日期的行数据,并保留对应日期的行结构。
内容的提问来源于stack exchange,提问作者Salih
相关产品推荐
相关产品推荐

