如何将Pandas DataFrame按连续4天滑动拆分并存入列表?
如何将Pandas DataFrame拆分为连续4天数据的滑动窗口列表
看起来你想要实现滑动窗口式的DataFrame切片,把连续4天的子DataFrame存入列表。你的单日切片思路是对的,但需要调整成滑动窗口的逻辑。下面我会一步步给你解决方法:
第一步:预处理数据(确保日期格式正确)
首先要把你的Date列转换为datetime类型,并且确保数据按日期排序(虽然你的示例数据已经有序,但实际场景中这一步很重要):
import pandas as pd # 构造你的示例DataFrame data = { 'Date': ['1/1/2017', '2/1/2017', '3/1/2017', '4/1/2017', '5/1/2017', '6/1/2017', '7/1/2017', '8/1/2017', '9/1/2017'], 'SKU': ['X1', 'X2', 'X1', 'X2', 'X1', 'X2', 'X2', 'X1', 'X1'], 'Balance': [8, 45, 47, 16, 14, 67, 9, 66, 158] } df = pd.DataFrame(data) # 转换Date列为datetime类型 df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y') # 按日期排序并重置索引 df = df.sort_values('Date').reset_index(drop=True)
第二步:实现滑动窗口切片
我们可以通过iloc按位置切片来实现滑动窗口。因为你的数据有9行,窗口大小为4,所以总共会生成9 - 4 + 1 = 6个窗口。
方法1:循环实现(直观易懂)
window_size = 4 df_list = [] for i in range(len(df) - window_size + 1): # 截取从索引i开始的连续4行 window_df = df.iloc[i:i+window_size].copy() # 重置子DataFrame的索引,和你示例中的输出格式一致 window_df = window_df.reset_index(drop=True) df_list.append(window_df)
方法2:列表推导式(更简洁)
如果喜欢更紧凑的代码,可以用列表推导式一步完成:
window_size = 4 df_list = [df.iloc[i:i+window_size].reset_index(drop=True) for i in range(len(df) - window_size + 1)]
验证结果
比如你要的「从第2天开始的连续4天数据」,对应Python列表的df_list[1](因为Python列表从0开始索引),输出如下:
Date SKU Balance 0 2017-01-02 X2 45 1 2017-01-03 X1 47 2 2017-01-04 X2 16 3 2017-01-05 X1 14
完全符合你的需求。
额外注意事项
如果你的实际数据存在日期不连续的情况(比如某天没有记录),需要先生成完整的日期序列,重新索引填充缺失值后再做滑动窗口:
# 生成完整的日期范围 full_dates = pd.date_range(start=df['Date'].min(), end=df['Date'].max()) # 重新索引,缺失的行用NaN填充(你也可以根据业务需求填充0或其他值) df_full = df.set_index('Date').reindex(full_dates).reset_index().rename(columns={'index': 'Date'}) # 再用上面的滑动窗口方法处理df_full即可
内容的提问来源于stack exchange,提问作者Ahamed Moosa
相关产品推荐
相关产品推荐

