如何在Pandas中按起止日期扩展行并保留起始日期?
解决Pandas按日期范围扩展行并保留起始/结束日期的问题
问题核心
现有代码的问题在于:
- 计算重复次数时仅用了
date_end - date_start的天数,会少生成起始日期对应的行(比如日期差1天只会生成1行,但实际需要包含起始+结束的2行) cumcount() + 1会让起始日期直接加1天,导致丢失原始起始日期
修正后的实现代码
import pandas as pd # 确保日期列是datetime类型(若未转换需执行) df['date_start'] = pd.to_datetime(df['date_start']) df['date_end'] = pd.to_datetime(df['date_end']) # 计算重复次数:日期差天数 + 1(包含起始和结束日期) d = (df['date_end'] - df['date_start']).dt.days + 1 df1 = df.reindex(df.index.repeat(d)) # 按原分组计算累计索引(从0开始) i = df1.groupby(level=0).cumcount() # 生成每日日期:起始日期 + 累计天数 df1['Dailydate'] = df1['date_start'] + pd.to_timedelta(i, unit='d') # 重置索引(可选,优化索引整洁度) df1 = df1.reset_index(drop=True)
代码说明
- 日期类型转换:先将
date_start和date_end转为datetime类型,避免后续时间计算出错 - 重复次数修正:用
天数差 + 1,保证起始、结束日期都能生成对应行 - 累计索引从0开始:
cumcount()默认从0开始,累加0天即为起始日期,依次递增得到完整日期序列 - 生成每日日期:通过
pd.to_timedelta将累计天数转为时间差,与起始日期相加得到目标日期列
运行后输出会完全匹配你给出的期望结果,包含每个日期范围的起始、中间、结束日期行。
内容的提问来源于stack exchange,提问作者darkwolf
相关产品推荐
相关产品推荐

