Python如何将DataFrame内的日期范围按年度拆分?
日期区间按周年拆分Python实现方案
前置依赖
需要提前安装pandas和python-dateutil库,未安装可执行以下命令:
pip install pandas python-dateutil
完整实现代码
步骤1:导入依赖并构造原始数据
import pandas as pd from dateutil.relativedelta import relativedelta # 构造原始DataFrame,实际使用时可替换为自己读取的数据 df = pd.DataFrame({ 'id': ['a1', 'b1'], 'start': ['2018-03-04', '2019-01-24'], 'end': ['2020-03-03', '2021-05-08'] }) # 将日期列转换为datetime格式,方便后续计算 df['start'] = pd.to_datetime(df['start']) df['end'] = pd.to_datetime(df['end'])
步骤2:定义区间拆分函数
def split_by_anniversary(row): split_rows = [] current_start = row["start"] original_end = row["end"] while current_start <= original_end: # 计算当前周期的到期日:起始日加1年再减1天 current_end = current_start + relativedelta(years=1) - relativedelta(days=1) # 若计算出的到期日晚于原始结束日期,取原始结束日期 if current_end > original_end: current_end = original_end # 保存当前拆分段 split_rows.append({ "id": row["id"], "start": current_start.strftime("%Y-%m-%d"), "end": current_end.strftime("%Y-%m-%d") }) # 更新下一段的起始日 current_start = current_end + relativedelta(days=1) return split_rows
步骤3:应用函数生成结果
# 逐行应用拆分函数,展开后转换为新的DataFrame split_result = df.apply(split_by_anniversary, axis=1).explode().tolist() result_df = pd.DataFrame(split_result)
结果验证
打印result_df即可得到和需求完全匹配的输出:
| id | start | end |
|---|---|---|
| a1 | 2018-03-04 | 2019-03-03 |
| a1 | 2019-03-04 | 2020-03-03 |
| b1 | 2019-01-24 | 2020-01-23 |
| b1 | 2020-01-24 | 2021-01-23 |
| b1 | 2021-01-24 | 2021-05-08 |
内容的提问来源于stack exchange,提问作者Rishabh Gupta
相关产品推荐
相关产品推荐

