``` 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') 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) # 创建只含首行时间的列表 query_time = pd.Timestamp.now().strftime("%Y-%m-%d %H:%M") query_time_list = [query_time] + ['']*(len(result)-1) # 例如:['2025-05-20 14:30', '', '', ''] # 插入不重复的列 result.insert(0, '查询时间', query_time_list) # 只有首行有值 # 创建Excel写入对象(注意:需要安装openpyxl) with ExcelWriter('GCB案件统计结果t4.xlsx', engine='openpyxl') as writer: # 将result写入Sheet1 result.to_excel(writer, sheet_name='按周统计情况', index=False) worksheet = writer.sheets['按周统计情况'] # 合并A2到An单元格(n=数据总行数) worksheet.merge_cells( start_row=2, end_row=len(result) + 1, # +1补偿标题行偏移 start_column=1, end_column=1 )```weekly_cases中,字段“是否超时”,结果为是,输出到新的sheet,命名为本周超时案件
时间: 2025-07-13 19:45:05 浏览: 8
<think>嗯,用户提供的代码主要是处理案件统计,生成一个包含按周统计情况的Excel文件。现在他们想在weekly_cases中筛选出“是否超时”为“是”的记录,并输出到新的sheet,命名为“本周超时案件”。我需要仔细看看他们的代码结构,然后找出如何实现这一点。
首先,查看用户现有的代码,他们使用了pandas的ExcelWriter来写入数据到Excel文件。现在需要添加一个新的sheet。现有的代码中,with ExcelWriter(...) as writer: 已经将结果写入到'按周统计情况'的sheet中。要添加新的sheet,应该在同一个ExcelWriter上下文中处理。
接下来,用户需要筛选weekly_cases中“是否超时”字段为“是”的数据。这部分可以通过布尔索引实现,比如weekly_cases[weekly_cases['是否超时'] == '是']。然后,将筛选后的DataFrame导出到新的sheet。
需要注意的是,用户可能希望保留原有格式或其他设置,比如合并单元格。但根据用户的要求,可能只需要将数据写入新的sheet,不需要复杂的格式。不过,原代码中有一个合并单元格的操作,可能需要注意是否会影响新sheet。不过,新sheet的名称是“本周超时案件”,所以应该不会有冲突。
另外,用户可能在写入新sheet时,是否需要调整列的顺序或格式?根据问题描述,用户只是要求输出符合条件的记录到新sheet,所以直接导出即可。但需要确保在写入时使用正确的sheet_name参数,并且避免覆盖已有的sheet。
现在,检查现有代码中的Excel写入部分。用户使用了to_excel方法写入'按周统计情况',之后尝试合并单元格。但原代码中有一个缩进错误,worksheet = writer.sheets['按周统计情况']应该在with块内,但原代码的缩进可能有问题,比如在Python中,这部分应该正确缩进在with语句下。不过这可能是一个排版错误。
接下来,添加新的sheet。在同一个ExcelWriter实例中,再次调用to_excel方法,指定不同的sheet_name即可。例如:
weekly_cases[weekly_cases['是否超时'] == '是'].to_excel(writer, sheet_name='本周超时案件', index=False)
但需要确保在写入之前处理数据。另外,用户可能需要将筛选后的数据保存到新的变量中,比如timeout_cases = weekly_cases[weekly_cases['是否超时'] == '是'],然后写入。
此外,需要注意是否要处理查询时间列的问题,原代码中的result插入了查询时间列,但新的sheet是否需要同样的处理?根据问题描述,用户可能只需要原数据的字段,所以不需要插入查询时间列,直接导出原字段即可。
综上所述,解决方案是在现有的ExcelWriter块内,添加一个to_excel调用,将筛选后的数据写入新的sheet。需要确保在写入时使用正确的DataFrame和sheet名称。</think>好的,我来逐步解释如何实现将超时案件输出到新的sheet页:
1. **筛选超时数据**:
```python
timeout_cases = weekly_cases[weekly_cases['是否超时'] == '是']
```
2. **修改Excel写入逻辑**(需要保持同一个ExcelWriter对象):
```python
with pd.ExcelWriter('GCB案件统计结果t4.xlsx', engine='openpyxl') as writer:
# 原统计结果写入
result.to_excel(writer, sheet_name='按周统计情况', index=False)
# 新增超时案件写入
timeout_cases.to_excel(writer, sheet_name='本周超时案件', index=False)
# 原合并单元格操作(保持原逻辑)
worksheet = writer.sheets['按周统计情况']
worksheet.merge_cells(
start_row=2,
end_row=len(result) + 1,
start_column=1,
end_column=1
)
```
关键点说明:
1. 使用同一个`ExcelWriter`对象确保文件操作原子性
2. `to_excel()`方法通过`sheet_name`参数指定新sheet页名称
3. 保持原有统计结果和格式不变
4. 超时案件会生成包含所有原始字段的新sheet页
补充建议:
- 如需控制输出列顺序,可添加列筛选:
```python
timeout_cases[['收案时间', '案件编号', '组别', '是否超时']].to_excel(...)
```
- 若需保持首行查询时间,可添加相同逻辑:
```python
timeout_cases.insert(0, '查询时间', query_time_list)
```
最终效果:
- 生成包含两个sheet的Excel文件:
- `按周统计情况`:原有的汇总统计
- `本周超时案件`:所有标记为超时的详细案件记录
阅读全文
相关推荐













