解决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 From | Date End | Date To |
|---|---|---|
| 2023-03-01 | 2023-03-08 | 2023-06-01 |
| 2023-03-09 | 2023-03-15 | 2023-06-01 |
| 2023-03-16 | 2023-03-22 | 2023-06-01 |
| ... | ... | ... |
| 2023-01-01 | 2023-01-08 | 2023-02-28 |
| 2023-01-09 | 2023-01-15 | 2023-02-28 |
| 2023-01-16 | 2023-01-22 | 2023-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_
相关产品推荐
相关产品推荐

