如何基于另一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
相关产品推荐
相关产品推荐

