```
# 读取组信息(新增代码)
df_group = pd.read_csv('项目-组.csv')
df_group = df_group.drop_duplicates(subset='PMNameMsg', keep='first')
# 合并数据(新增代码)
merged_data = pd.merge(
merged_data,
df_group[['PMNameMsg', '组名', '组长']],
on='PMNameMsg',
how='left'
)
# 处理工期列中的"协商"文本(替换为0)
merged_data['工期'] = pd.to_numeric(merged_data['工期'].replace('协商', -999), errors='coerce').fillna(-999)
# # 处理空值
# merged_data['GongQiHuanBan'] = merged_data['GongQiHuanBan'].fillna(0)
# 新增日期列转换
merged_data['HuanBanDate'] = pd.to_datetime(merged_data['HuanBanDate'], errors='coerce')
merged_data['HuanBanReDate'] = pd.to_datetime(merged_data['HuanBanReDate'], errors='coerce')
# 日期格式转换
merged_data['SADate'] = pd.to_datetime(merged_data['SADate'])
merged_data['UpdateTime'] = pd.to_datetime(merged_data['UpdateTime'])
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) # 转换日期格式
def calculate_workdays(start_date, end_date):
# 处理未结案情况
end_date = end_date if pd.notnull(end_date) else pd.Timestamp.now()
# 生成日期序列
date_range = pd.date_range(start=start_date.normalize(),
end=end_date.normalize(),
freq='D')
# 修改过滤条件(增加调休判断)
workdays = [date for date in date_range
if (
(date.weekday() < 5) or # 常规工作日
(date in adjustment_dates) # 调休补班日
)
and (date not in holiday_dates) # 排除法定假日
]
return len(workdays)
def compute_huanban_days(row):
start = row['HuanBanDate']
if pd.isnull(start):
return 0
end = row['HuanBanReDate'] if pd.notnull(row['HuanBanReDate']) else pd.Timestamp.now()
if start > end:
return 0
return calculate_workdays(start, end)
merged_data['GongQiHuanBan'] = merged_data.apply(compute_huanban_days, axis=1)
# 计算总工期
merged_data['总工期'] = merged_data['工期'] + merged_data['GongQiHuanBan']
# 计算实际工作日
merged_data['实际工作日'] = merged_data.apply(
lambda x: calculate_workdays(x['SADate'], x['UpdateTime']), axis=1
)
# 判断超时
merged_data['是否超时'] = '否'
merged_data['超时天数'] = 0
mask = merged_data['实际工作日'] > merged_data['总工期']
merged_data.loc[mask, '是否超时'] = '是'
merged_data.loc[mask, '超时天数'] = merged_data['实际工作日'] - merged_data['总工期']```getchaoshi()函数可以返回一个merged_data。merged_data中的StatusName为案件状态,当状态=办结或者=发件时,案件为已完成;等于其他情况,案件为正在办件。组名用来分组。是否超时列,存储了是和否。以程序查询时间开始,往前获取5个工作日,统计SADate在这个时间范围内的案件个数,为本周案件总数以组统计;并根据案件状态,分别统计本周已完成和正在处理的案件数量;根据是否超时,为是的,分组本周统计各组超时案件数量
最新发布