如何将已有考勤数据填充到包含整月日期的月度DataFrame中
实现方案
核心逻辑
我们可以通过「分组聚合→长宽表转换→透视补全日期列」三步完成需求,具体实现如下:
首先导入依赖:
import pandas as pd from calendar import monthrange
步骤1:定义生成目标月度所有日期的工具方法
def get_month_dates(year, month): # 获取当月总天数 _, days = monthrange(year, month) # 生成当月所有日期的字符串列表,格式和原数据date列保持一致 return [f"{year}-{str(month).zfill(2)}-{str(day).zfill(2)}" for day in range(1, days+1)]
步骤2:处理原始考勤数据生成目标表
# 示例原始数据 example = pd.DataFrame({ 'Employee': ["Alex", "Alex", "Alex", "Bob", "Peter", "Peter"], 'date': ['2021-01-01', '2021-01-01', '2021-01-03', '2021-01-02', '2021-01-01', '2021-01-02'], 'Total Hour': [1.5, 2.2, 7, 1, 3, 6], 'Overtime': [1.5, 0, 1.2, 2.3, 1.7, 5] }) # 1. 按员工+日期分组,聚合同一天的多条考勤记录 agg_df = example.groupby(['Employee', 'date'], as_index=False).sum() # 2. 将指标列(总时长、加班时长)转为长格式 melt_df = agg_df.melt( id_vars=['Employee', 'date'], value_vars=['Total Hour', 'Overtime'], var_name='统计项' ) # 3. 获取目标月份的所有日期,这里以2021年1月为例 target_year = 2021 target_month = 1 all_dates = get_month_dates(target_year, target_month) # 4. 生成透视表,补全所有日期列 result = melt_df.pivot( index=['Employee', '统计项'], columns='date', values='value' # 重新设置列顺序按当月日期排序,无数据的位置填充空字符串 ).reindex(columns=all_dates).fillna('').reset_index() # 输出查看结果 print(result)
后续考勤数据更新方法
新的考勤数据提交后,只需要将新数据追加到原始考勤DataFrame中,再重新执行上述步骤即可生成最新的月度考勤表,不需要额外兼容处理。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

