如何用Pandas按每日起始的1年间隔拆分股票价格DataFrame
解决方案
要实现每日起始的1年滑动窗口子DataFrame,你需要遍历每个日期作为起始点,筛选对应时间区间内的数据,而不是用年度分组。以下是具体实现步骤:
步骤1:确保日期列是datetime类型
首先将date列转换为pandas的datetime格式,这样才能进行日期运算:
import pandas as pd df['date'] = pd.to_datetime(df['date'])
步骤2:生成滑动窗口子DataFrame
遍历数据中的每个唯一日期作为起始点,计算该日期往后1年的结束时间,然后筛选区间内的数据:
# 获取所有唯一的起始日期 start_dates = df['date'].unique() # 初始化子DataFrame列表 sub_dfs = [] for start_date in start_dates: # 计算窗口结束日期(起始日期+1年) end_date = start_date + pd.DateOffset(years=1) # 筛选[start_date, end_date)区间内的数据 window_df = df[(df['date'] >= start_date) & (df['date'] < end_date)].copy() # 可选:给子DataFrame添加起始日期标识,方便后续区分 window_df['window_start'] = start_date sub_dfs.append(window_df)
关键说明
- 该方法自动处理日期缺失的情况:如果某段时间内有日期缺失,对应的子DataFrame只会包含实际存在的行,行数不固定。
- 当遍历到数据末尾的日期时,结束日期可能超出数据的最后日期,此时子DataFrame会包含从起始日期到数据末尾的所有剩余数据,符合你“直至数据末尾”的需求。
- 使用
.copy()是为了避免pandas的SettingWithCopyWarning,确保每个子DataFrame是独立的对象。
为什么你的原代码不行?
你之前用的df.groupby(pd.Grouper(key='date',freq='1Y'))是按年度边界分组(比如2002年全年、2003年全年),只会生成2个子DataFrame,和你需要的每日滑动窗口逻辑完全不同,因此无法满足需求。
内容的提问来源于stack exchange,提问作者dimwit
相关产品推荐
相关产品推荐

