You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:18