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

如何基于另一DataFrame的日期索引拆分目标DataFrame

解决方案

你之前的迭代逻辑存在本质错误:每次循环调用一次next(it)会跳过一个边界日期,5个边界点只会生成2个区间,自然无法覆盖全部分段要求。
pandas的DatetimeIndex本身支持闭区间切片,只要按相邻边界两两配对切片,就能完全匹配你要的拆分效果,具体实现如下:

核心实现代码

# 先确保索引按日期升序排列,避免切片异常
df1 = df1.sort_index()
boundary_dates = df2.sort_index().index

result = 0
# 相邻日期两两配对,生成所有分段的起止时间对
for seg_idx, (start, end) in enumerate(zip(boundary_dates[:-1], boundary_dates[1:]), start=1):
    # DatetimeIndex的loc切片默认是闭区间,自动包含起止日期对应的行,完全符合需求
    new_df = df1.loc[start:end]
    
    # 以下替换为你Littlewood泥沙负荷计算的分段逻辑
    interval_days = (end - start).days + 1  # 区间自然天数,要统计实际有数据的天数用len(new_df)
    val_mean = new_df['Value_df1'].mean()
    val_std = new_df['Value_df1'].std()
    segment_res = val_mean * interval_days # 示例计算式,替换为你的实际公式
    result += segment_res

    # 如果需要留存拆分后的所有子DataFrame,在此处追加到列表即可
    # print(f"NEW DF{seg_idx}:\n{new_df}\n")

效果说明

用你提供的样例数据运行上述代码,会生成4个分段,和你给出的预期拆分结果完全一致:

  • NEW DF1:时间范围1992-01-02 至 1992-01-10,包含边界行
  • NEW DF2:时间范围1992-01-10 至 1992-01-15,包含边界行
  • NEW DF3:时间范围1992-01-15 至 1992-01-20,包含边界行
  • NEW DF4:时间范围1992-01-20 至 1992-01-21,包含边界行

注意事项

  • 不要使用迭代器跳步取数的写法,zip(边界列表[:-1], 边界列表[1:])是相邻元素配对最稳妥的实现,不会漏区间也不会出现迭代器耗尽的报错
  • 如果df1中存在部分边界日期无对应数据的情况,可以在切片后增加if new_df.empty: continue逻辑跳过空分段,避免统计计算报错
  • 区间天数如果要算自然日间隔用(end-start).days +1,如果要算实际有观测数据的天数直接用len(new_df)即可,根据业务需求选择

内容的提问来源于stack exchange,提问作者jei L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:24:28