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

解决while循环仅支持单行DataFrame的行复制适配问题

按周拆分多行日期区间生成对应行的解决方案

问题描述

初始创建的pandas DataFrame如下:

import pandas as pd
import datetime

df = pd.DataFrame({'Date From': ['2023-03-01', '2023-01-01'], 
                   'Date To': ['2023-06-01', '2023-02-28']
                 })
df['Date From'] = pd.to_datetime(df['Date From'])
df['Date To'] = pd.to_datetime(df['Date To'])
df['Date End'] = df['Date From'] + datetime.timedelta(days=7)
df['Date End'] = pd.to_datetime(df['Date End'])

尝试用while循环复制行,但该循环仅在DataFrame只有1行时有效:

while df['Date End'].iloc[-1] < df['Date To'].iloc[0]:
    new_row = {'Date From': df['Date End'].iloc[-1] + datetime.timedelta(days=1),
               'Date End': df['Date End'].iloc[-1] + datetime.timedelta(days=7),
               'Date To': df['Date To'].iloc[0]
              }
    df = df.append(new_row, ignore_index=True)

尝试添加ID列结合groupby处理,但groupby与append/iloc配合不顺畅。期望最终得到的DataFrame格式如下:

Date FromDate EndDate To
2023-03-012023-03-082023-06-01
2023-03-092023-03-152023-06-01
2023-03-162023-03-222023-06-01
.........
2023-01-012023-01-082023-02-28
2023-01-092023-01-152023-02-28
2023-01-162023-01-222023-02-28

需要修改代码实现对多行初始DataFrame按周拆分日期区间并复制行的需求。

解决方案

通过对初始DataFrame的每一行单独生成拆分后的周区间行,再合并所有结果即可实现需求,具体代码如下:

import pandas as pd
import datetime

# 初始DataFrame
df = pd.DataFrame({'Date From': ['2023-03-01', '2023-01-01'], 
                   'Date To': ['2023-06-01', '2023-02-28']
                 })
df['Date From'] = pd.to_datetime(df['Date From'])
df['Date To'] = pd.to_datetime(df['Date To'])

def split_date_range(row):
    rows = []
    current_start = row['Date From']
    while True:
        current_end = current_start + datetime.timedelta(days=7)
        # 最后一周若超出Date To则截断
        if current_end > row['Date To']:
            current_end = row['Date To']
        rows.append({
            'Date From': current_start,
            'Date End': current_end,
            'Date To': row['Date To']
        })
        # 更新下一周的起始日期
        current_start = current_end + datetime.timedelta(days=1)
        # 起始日期超过Date To时终止循环
        if current_start > row['Date To']:
            break
    return pd.DataFrame(rows)

# 对每行应用拆分函数并合并结果
result_df = pd.concat(df.apply(split_date_range, axis=1).tolist(), ignore_index=True)

print(result_df)

代码说明

  • split_date_range函数接收初始DataFrame的单行数据,生成该日期区间内所有按周拆分的子区间记录。
  • 循环中会自动处理最后一周的截断,确保区间不超出原Date To的范围。
  • 使用df.apply遍历每一行执行拆分,再通过pd.concat合并所有拆分后的小DataFrame,得到最终的完整结果。

这种方式无需依赖groupby和append,能稳定处理多行初始数据,逻辑清晰且易于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:27:08