如何实现特定日期区间内的数据外推与重复映射?
问题描述
原始数据:
start end nominal 1 8/23/2021 9/15/2021 10000 2 9/1/2021 9/15/2021 100500 3 9/2/2021 9/15/2021 30000 4 9/3/2021 9/15/2021 2200
需要转换为以下格式:生成从start列最早日期到end列最晚日期的连续日期序列,将每条数据的nominal值(示例中为原数值除以10)映射到对应的日期区间内:
date 1 2 3 4 2021-08-23 00:00:00 1000 2021-08-24 00:00:00 1000 ... 2021-09-15 00:00:00 1000 10050 3000 2200
解决方案
可以用Pandas的日期序列生成、区间匹配和透视表实现,步骤如下:
- 数据预处理
将日期列转为datetime类型,同时按示例要求处理nominal值:
import pandas as pd # 加载原始数据 data = { 'start': ['8/23/2021', '9/1/2021', '9/2/2021', '9/3/2021'], 'end': ['9/15/2021', '9/15/2021', '9/15/2021', '9/15/2021'], 'nominal': [10000, 100500, 30000, 2200] } df = pd.DataFrame(data, index=[1,2,3,4]) # 转换日期格式,处理数值(示例中nominal除以10) df['start'] = pd.to_datetime(df['start']) df['end'] = pd.to_datetime(df['end']) df['value'] = df['nominal'] // 10
- 生成连续日期序列
确定日期范围,生成每日连续序列:
min_date = df['start'].min() max_date = df['end'].max() date_range = pd.date_range(start=min_date, end=max_date, freq='D') date_df = pd.DataFrame({'date': date_range})
- 匹配区间并透视成目标格式
为每条原始数据匹配对应日期区间,再通过透视表转换结构:
# 展开每条数据对应的日期行 expanded_rows = [] for idx, row in df.iterrows(): # 筛选当前数据覆盖的日期 mask = (date_df['date'] >= row['start']) & (date_df['date'] <= row['end']) temp = date_df[mask].copy() temp['id'] = idx temp['value'] = row['value'] expanded_rows.append(temp) # 合并所有行并透视 combined_df = pd.concat(expanded_rows, ignore_index=True) result = combined_df.pivot(index='date', columns='id', values='value').fillna('') # 调整格式:去掉列名标签、格式化日期显示 result.columns.name = None result.index = result.index.strftime('%Y-%m-%d 00:00:00')
- 输出结果
print(result.to_string())
运行后即可得到目标格式的输出。
内容的提问来源于stack exchange,提问作者bella
相关产品推荐
相关产品推荐

