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

如何在Pandas DataFrame中补全缺失的工作日(周一至周五)?

补全Pandas DataFrame缺失工作日的最简方法

这个需求我日常处理时间序列数据时经常碰到,用Pandas自带的工具链就能轻松搞定,几步就能达到你要的效果:

步骤1:先把日期列转成datetime类型

首先得确保你的date列是Pandas能识别的日期格式,不然没法进行后续的日期操作:

import pandas as pd

# 先构造你提供的原始DataFrame
df = pd.DataFrame({
    'date': ['2021-01-18', '2021-01-19', '2021-01-22', '2021-01-26', '2021-01-27', '2021-01-28', '2021-01-29'],
    'count1': [3, 1, 1, 4, 2, 2, 0],
    'count2': [4, 2, 0, 3, 3, 0, 2]
})

# 将date列转换为datetime类型
df['date'] = pd.to_datetime(df['date'])

步骤2:生成完整的工作日序列

用pd.date_range生成从原数据最早日期到最晚日期的所有工作日,参数freq='B'专门指代周一到周五的工作日:

# 获取原始数据的日期边界
start_date = df['date'].min()
end_date = df['date'].max()

# 生成包含所有工作日的序列
business_days = pd.date_range(start=start_date, end=end_date, freq='B')

步骤3:重新索引并填充缺失值

把原DataFrame的date设为索引,用刚才生成的工作日序列重新对齐数据,最后把缺失的count1、count2填充为0,再恢复原有的列结构:

# 重新索引并填充缺失值
df_complete = df.set_index('date').reindex(business_days).fillna(0).reset_index()

# 把重置索引后的列名改回date
df_complete = df_complete.rename(columns={'index': 'date'})

# 把数值列转回整数(fillna后会变成浮点数,按需调整)
df_complete[['count1', 'count2']] = df_complete[['count1', 'count2']].astype(int)

执行完上面的代码,你得到的df_complete就是你想要的结果了。

极简一行版(可选)

如果追求代码精简,可以把步骤合并成一行(可读性稍弱,但更紧凑):

df_complete = (df.assign(date=pd.to_datetime(df['date']))
               .set_index('date')
               .reindex(pd.date_range(df['date'].min(), df['date'].max(), freq='B'))
               .fillna(0)
               .astype({'count1': int, 'count2': int})
               .reset_index()
               .rename(columns={'index': 'date'}))

补充:如果你的场景需要排除法定节假日,可以用pandas.tseries.offsets.CustomBusinessDay自定义工作日规则,但如果只是普通的周一到周五,freq='B'完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:42:31