如何基于日期索引为Pandas DataFrame扩展前后2天的行?
解决Pandas DataFrame按日期索引扩展前后行的问题
嘿,我来帮你搞定这个需求!咱们的目标是给DataFrame里的每一行,围绕它的日期索引额外添加前后各2天的行,新增行的value值直接沿用原行的。下面我用具体的代码示例一步步实现:
步骤1:构造示例DataFrame
先创建一个简单的测试数据,方便后续演示效果:
import pandas as pd # 构造测试数据 data = {'value': [10, 20, 30]} # 设置日期索引 original_dates = pd.to_datetime(['2016-06-06', '2016-06-10', '2016-06-15']) df = pd.DataFrame(data, index=original_dates) print("原DataFrame:") print(df)
输出的原数据长这样:
value 2016-06-06 10 2016-06-10 20 2016-06-15 30
步骤2:实现扩展核心逻辑
接下来编写核心代码,遍历每一行并生成对应的扩展行:
# 初始化空列表,用来存储所有扩展后的行数据 expanded_rows = [] # 遍历原DataFrame的每一行 for current_date, row in df.iterrows(): # 生成当前日期前后各2天的日期范围(包含原日期) date_range = pd.date_range( start=current_date - pd.Timedelta(days=2), end=current_date + pd.Timedelta(days=2), freq='D' ) # 为每个日期创建一行数据,value沿用原行的值 for date in date_range: expanded_rows.append({'date': date, 'value': row['value']}) # 将列表转换为DataFrame,并设置date为索引 expanded_df = pd.DataFrame(expanded_rows).set_index('date') print("\n扩展后的DataFrame:") print(expanded_df)
执行后你会看到:每一行原数据都扩展成了5行(原日期+前后各2天),比如原索引2016-06-06的行,会新增2016-06-04、2016-06-05、2016-06-07、2016-06-08这4行,所有新增行的value都是10,完全符合你的需求。
额外小提示
- 如果不同原行的扩展日期有重叠(比如两个原行的扩展范围出现重复日期),最终的DataFrame会保留这些重复行。如果需要合并重复日期的行,可以用
expanded_df = expanded_df.groupby(expanded_df.index).agg({'value': 'first'})(或者根据需求选择求和、均值等聚合方式)。 - 如果你不需要保留原日期的行,只需要新增的4行,可以在生成
date_range后过滤掉原日期:date_range = date_range[date_range != current_date]。
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

