如何在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
相关产品推荐
相关产品推荐

