```
def get_5_workdays_back(end_date=None):
"""计算从结束日期倒推5个工作日的起始日期"""
end_date = pd.Timestamp.now().normalize() if end_date is None else end_date
count = 0
current_date = end_date
# 复用原有节假日配置
holidays = [
# 元旦(不调休)
'2025-01-01', # 周三
# 春节(调休2天)
'2025-01-28', '2025-01-29', '2025-01-30', '2025-01-31',
'2025-02-01', '2025-02-02', '2025-02-03', '2025-02-04', # 1.28(除夕)-2.4
# 清明节(不调休)
'2025-04-04', '2025-04-05', '2025-04-06', # 周五-周日
# 劳动节(调休1天)
'2025-05-01', '2025-05-02', '2025-05-03', '2025-05-04', '2025-05-05', # 周四-周一
# 端午节(不调休)
'2025-05-31', '2025-06-01', '2025-06-02', # 周六-周一
# 中秋节+国庆节(调休2天)
'2025-10-01', '2025-10-02', '2025-10-03', '2025-10-04',
'2025-10-05', '2025-10-06', '2025-10-07', '2025-10-08' # 周三-下周三
]
holiday_dates = pd.to_datetime(holidays)
# 新增调休工作日列表(转换为日期格式)
workdays_adjustment = [
'2025-01-26', # 周日补春节
'2025-02-08', # 周六补春节
'2025-04-27', # 周日补劳动节
'2025-09-28', # 周日补国庆
'2025-10-11' # 周六补国庆
]
adjustment_dates = pd.to_datetime(workdays_adjustment) # 转换日期格式
while count < 5:
current_date -= pd.Timedelta(days=1)
# 判断是否为有效工作日
is_workday = (
(current_date.weekday() < 5 or current_date in adjustment_dates)
and current_date not in holiday_dates
)
if is_workday:
count += 1
return current_date, end_date
# 获取处理后的数据
df = getchaoshi()
# 计算时间范围
start_date, end_date = get_5_workdays_back()
date_mask = (df['收案时间'] >= start_date) & (df['收案时间'] <= end_date)
weekly_cases = df[date_mask].copy()
# 计算上周时间范围
last_week_start, _ = get_5_workdays_back(start_date)
date_mask_last_week = (df['收案时间'] >= last_week_start) & (df['收案时间'] < start_date)
last_weekly_cases = df[date_mask_last_week].copy()
# 分组统计上周数据
last_week_stats = last_weekly_cases.groupby('组别')['案件状态'].count().reset_index()
last_week_stats.columns = ['组别', '上周总案件数']
# 新增:统计上周已完成案件(根据结案时间)
date_mask_last_week_closed = (df['结案时间'] >= last_week_start) & (df['结案时间'] < start_date)
last_week_closed_cases = df[date_mask_last_week_closed].copy()
# 分组统计上周已完成数据
last_week_closed_stats = last_week_closed_cases.groupby('组别')['案件状态'].count().reset_index()
last_week_closed_stats.columns = ['组别', '上周已完成情况']
# 添加状态分类列
weekly_cases['状态分类'] = weekly_cases['案件状态'].apply(
lambda x: '已完成' if x in ['办结', '发件'] else '正在处理'
)
# 分组统计
result = weekly_cases.groupby('组别').agg(
总案件数=('案件状态', 'count'),
已完成=('状态分类', lambda x: (x == '已完成').sum()),
处理中=('状态分类', lambda x: (x == '正在处理').sum()),
超时案件数=('是否超时', lambda x: (x == '是').sum()),
缓办案件数=('是否缓办', lambda x: (x == '是').sum()) # 新增行
).reset_index()
# # 合并上周数据
# result = result.merge(last_week_stats, on='组别', how='left').fillna(0)
# 合并三组数据(原代码基础上增加新列)
result = result.merge(last_week_stats, on='组别', how='left')
result = result.merge(last_week_closed_stats, on='组别', how='left').fillna(0)
# 新增:添加总计行(核心修改点)
total_row = {
'组别': '总计',
'总案件数': result['总案件数'].sum(),
'已完成': result['已完成'].sum(),
'处理中': result['处理中'].sum(),
'超时案件数': result['超时案件数'].sum(),
'缓办案件数': result['缓办案件数'].sum(),
'上周总案件数': result['上周总案件数'].sum(),
'上周已完成情况': result['上周已完成情况'].sum() # 新增列
}
result = pd.concat([result, pd.DataFrame([total_row])], ignore_index=True)
# 结果展示样例
print(result.to_markdown(index=False))
# 创建Excel写入对象(注意:需要安装openpyxl)
with ExcelWriter('GCB案件统计结果t4.xlsx', engine='openpyxl') as writer:
# 将result写入Sheet1
result.to_excel(writer, sheet_name='按周统计情况', index=False)
# 将原始数据写入Sheet2
weekly_cases.to_excel(writer, sheet_name='本周案件', index=False)
# 将原始数据写入Sheet3
df.to_excel(writer, sheet_name='所有案件', index=False)```输出的结果表“按周统计情况”,添加四列,一列为“较上周记录新增册数”,计算为:总案件数-上周总案件数;二列为“较上周记录结案册数”,计算为:已完成-上周已完成情况;三列为”新增册数百分比“,计算为:较上周记录新增册数/上周总案件数,百分数表达;四列为”完成率百分比“=较上周记录结案册数/上周总案件数,百分数表达。