``` merged_data = pd.merge(workday, delay_data, on='CHId', how='left')```merged_data 中,工期列为存储的工期时间(工作日天),可能存在文本“协商”。GongQiHuanBan列为工期暂停的时间(工作日天),可能会存在空值,将空值填充为0,SADate列为案件收件时间,如2025/1/2 9:31:28,paraDate9列为案件结束时间,可能存在空值。判断案件超时及超时天数,当paraDate9有结案时间时,计算结案时间和收件时间之间有多少个工作日(去除节假日),与工期列的工期和GongQiHuanBan列的之和比较,大于等于时,判断结果为超时,输出到新的一列“是否超时”,超时,并计算超时天数。反之输出否,不需要计算天数。当paraDate9无结案时间时,程序运行时间来作为结算时间进行计算,计算结案时间和收件时间之间有多少个工作日(去除节假日),与工期列的工期和GongQiHuanBan列的之和比较,大于等于时,判断为超时,输出“是否超时”列,超时,并计算超时天数。反之输出否,不需要计算天数。
时间: 2025-07-07 20:43:33 浏览: 5
<think>嗯,我现在要处理用户提供的这个Pandas数据合并后的任务。首先,我需要理解用户的需求。他们有一个merged_data的DataFrame,里面有几个关键列:工期列(可能包含文本“协商”)、GongQiHuanBan列(可能有空值,需要填充为0)、SADate列(收件时间)、paraDate9列(结案时间,可能为空)。目标是根据这些信息判断案件是否超时,并计算超时天数。
首先,我需要处理工期列中的“协商”问题。用户提到可能需要将这些值替换为0或者特定的数值,但具体怎么处理呢?用户没有明确说明,可能需要进一步询问,但根据常规处理,或许将“协商”替换为0或者根据业务规则赋予一个默认值。这里假设替换为0,但需要后续确认。
接下来,GongQiHuanBan列有空值,需要填充为0。这一步应该比较简单,用fillna(0)就可以了。
然后,处理日期时间的问题。SADate和paraDate9需要转换成datetime类型。如果paraDate9为空的话,需要用当前时间(即程序运行时间)来替代。这里要注意时区的问题吗?用户没有提到,所以可能用本地时间即可。
关键部分是计算收件时间和结案时间之间的工作日天数,去除节假日。这里需要用到自定义的工作日计算,可能需要使用pandas的bdate_range或者自定义一个工作日历,排除节假日。但用户没有提供节假日的列表,所以可能需要使用默认的工作日计算,即不包括周末,或者需要用户提供节假日数据。这里可能需要假设默认的工作日计算不包括周末,或者需要用户补充信息。假设用户希望排除周末,但如果有节假日列表,应整合进去。
然后,比较这个工作日的天数与工期列加上GongQiHuanBan列之和。如果工作天数大于等于工期总和,则超时,否则不超时。当超时时,计算超时天数(即工作天数减去工期总和),否则不计算天数。
对于paraDate9为空的情况,使用当前时间作为结案时间进行计算。这时候需要注意,程序运行时的时间可能不同,所以每次运行结果可能变化。例如,如果今天运行,结案时间就是现在的时间,过几天再运行结果可能不同。
步骤总结:
1. 处理工期列中的“协商”,替换为数值(比如0)。
2. 填充GongQiHuanBan列的空值为0。
3. 转换SADate和paraDate9为datetime类型。
4. 对paraDate9为空的情况,用当前时间填充。
5. 计算两个日期之间的工作日数,排除节假日。
6. 计算总工期(工期列 + GongQiHuanBan)。
7. 比较工作日数和总工期,判断是否超时,计算超时天数。
8. 将结果写入新列“是否超时”和“超时天数”。
可能的难点在于计算工作日数,尤其是排除节假日。如果没有节假日数据,可能需要使用标准的周一至周五作为工作日。这时候可以用pd.bdate_range来计算,但需要注意起始和结束日期是否正确包含在内。例如,如果开始日期是2025/1/2 9:31:28,结束日期是2025/1/5(假设是周六),那么工作日数应该是多少?需要测试一下。
另外,工期列可能存在非数值,比如“协商”,需要处理。这里需要确保工期列是数值类型。例如,将“协商”替换为0或者删除这些行?用户可能希望保留这些行,但如何处理超时判断?假设替换为0的话,总工期就是GongQiHuanBan的值,可能影响判断结果。所以需要用户确认处理方式,但在此问题中用户可能希望将“协商”视为0,或者视为特殊情况需要单独处理。但根据问题描述,用户可能希望将“协商”视为无效工期,所以替换为0,或者在计算时排除这些行?可能需要进一步说明。但根据用户提供的处理逻辑,可能直接替换为0,然后进行计算。
另外,工期列和GongQiHuanBan列之和是否为数值?需要确保两列都是数值类型。例如,将工期列中的文本转换为数值,如无法转换则设为0。
可能的代码步骤:
1. 处理工期列:
merged_data['工期'] = pd.to_numeric(merged_data['工期'], errors='coerce').fillna(0)
或者,如果“协商”需要特殊处理:
merged_data['工期'] = merged_data['工期'].replace('协商', 0).astype(float)
2. 填充GongQiHuanBan列:
merged_data['GongQiHuanBan'] = merged_data['GongQiHuanBan'].fillna(0)
3. 转换日期列:
merged_data['SADate'] = pd.to_datetime(merged_data['SADate'])
merged_data['paraDate9'] = pd.to_datetime(merged_data['paraDate9'])
4. 填充paraDate9为空的情况:
current_time = pd.Timestamp.now()
merged_data['paraDate9_filled'] = merged_data['paraDate9'].fillna(current_time)
或者,在计算时动态处理,可能更高效。
5. 计算工作日数:
这里可能需要定义一个函数,计算两个日期之间的工作日数,排除周末和节假日。假设没有节假日列表,可以使用numpy的busday_count,但需要将日期转换为适当的格式。
例如:
from pandas.tseries.offsets import CustomBusinessDay
from pandas import DateOffset
或者使用busday_count:
merged_data['工作日天数'] = merged_data.apply(lambda row: np.busday_count(row['SADate'].date(), row['paraDate9_filled'].date()), axis=1)
但需要注意,如果paraDate9_filled的时间比SADate早的话,可能需要处理顺序问题。或者确保paraDate9_filled >= SADate,否则结果可能为负。需要确保paraDate9_filled >= SADate,否则可能需要绝对值或者交换日期顺序。
或者使用pandas的date_range,计算工作日数:
def calculate_workdays(start, end):
# 创建工作日历,排除周末(周六、周日)
workdays = pd.bdate_range(start=start.floor('D'), end=end.floor('D'), freq='B')
return len(workdays)
但需要注意,如果start和end是同一天,可能需要处理。例如,如果收件时间和结案时间在同一天,那么工作日数为0还是1?根据业务需求,可能算作0天还是1天。例如,假设收件时间是1月2日上午,结案时间是同一天下午,那么是否算作一天?或者需要判断是否超过当天的工作时间?
用户的问题中并没有说明这一点,可能需要假设,只要日期不同,就按自然日计算工作日。例如,如果两个日期相同,则工作日数为0;否则,计算中间的日期。或者,如果结案时间在收件时间的之后,则计算包括结束日期当天吗?例如,开始日期是1月2日,结束日期是1月3日,那么工作日数是1天?这需要明确。通常,计算两个日期之间的工作日数可能需要考虑是否包含结束日期。比如,从1月2日到1月3日(均为工作日),那么可能是1天,或者2天,取决于计算方法。这需要明确业务规则。
这里可能需要进一步澄清,但根据常规做法,可能使用np.busday_count,该函数计算的是[start, end)之间的工作日数,即不包括结束日期。例如,如果start和end是同一个工作日,返回0。如果start是周一,end是周二,返回1。这可能与实际业务需求不符,比如,如果案件在周二结束,是否应该计算周一这一天?需要根据业务规则调整。
或者,用户可能希望包含结束日期当天,如果结束日期是工作日的话。此时,可能需要将结束日期加1天,再计算。例如:
merged_data['工作日天数'] = merged_data.apply(lambda row: np.busday_count(row['SADate'].date(), (row['paraDate9_filled'] + pd.DateOffset(days=1)).date()), axis=1)
或者,需要根据具体需求调整。
假设使用np.busday_count,并且希望包含结束日期,如果结束日期的时间不是午夜的话。例如,如果结束日期是当天的任何时间,都算作一个工作日。这种情况下,可能需要将结束日期的日期加1天,然后计算。例如:
merged_data['工作日天数'] = merged_data.apply(lambda row: np.busday_count(row['SADate'].normalize().date(), row['paraDate9_filled'].normalize().date() + pd.offsets.Day(1)), axis=1)
这里可能需要处理日期格式,并确保正确性。
假设用户只需要计算自然日中的工作日,不考虑时间部分,那么可以将SADate和paraDate9_filled转换为日期,然后计算之间的工作日数,包含结束日期。
另外,如果用户有节假日列表,需要传入holidays参数到busday_count。例如:
holidays = [...] # 节假日的日期列表
merged_data['工作日天数'] = merged_data.apply(lambda row: np.busday_count(row['SADate'].date(), row['paraDate9_filled'].date(), holidays=holidays), axis=1)
但用户没有提供节假日数据,所以可能这部分无法处理,或者需要用户自己提供。问题描述中提到“去除节假日”,但如果没有数据,可能需要忽略,或者提醒用户需要节假日数据。
综上,假设没有节假日数据,只排除周末,使用np.busday_count,那么代码可能如下:
merged_data['SADate_date'] = merged_data['SADate'].dt.normalize()
merged_data['paraDate9_filled'] = merged_data['paraDate9'].fillna(pd.Timestamp.now()).dt.normalize()
然后,对于每一行,计算两个日期之间的工作日数:
merged_data['工作日天数'] = merged_data.apply(
lambda row: np.busday_count(row['SADate_date'].to_pydatetime().date(),
row['paraDate9_filled'].to_pydatetime().date()),
axis=1
)
但是,np.busday_count不包含结束日期,所以如果需要包含,可能需要将结束日期加一天。例如,如果结案时间在某个工作日的下午,则算作该工作日有效。例如,开始日期是1月2日(周一),结束日期是1月3日(周二),那么工作日天数是1天?或者两天?这需要明确业务规则。如果工期是1天,那么是否允许在第二个工作日内完成不算超时?
这里可能需要将结束日期的时间考虑进去。例如,如果收件时间是1月2日9:31,结案时间是1月2日10:00,那么是否算作0个工作日?或者算作当天完成,不算超时。如果工期是0天,那么无论多少时间都不超时。或者,如果工期是1天,那么需要在下一个工作日结束前完成。
这个问题比较复杂,可能需要将收件日期和结案日期都转换为日期(忽略时间部分),然后计算两者之间的工作日数,如果结案日期的时间在收件日期的时间之后,可能需要算作多一天?或者直接按日期计算,忽略时间。
根据用户的问题描述,可能只需要计算日期之间的工作日数,忽略具体时间。例如,收件日期是2025/1/2,结案日期是2025/1/3(假设都是工作日),则算作1个工作日。如果工期是1天,那么刚好不超时。如果结案日期是2025/1/4(周六),则可能不算工作日,所以实际工作日天数还是1天(如果1/3是周五的话)。
现在回到代码逻辑,假设使用np.busday_count,并且不包含结束日期,那么如果结束日期是工作日,是否需要加1?
可能需要测试几个例子:
例子1:
收件日期:2023-10-02(周一)
结案日期:2023-10-03(周二)
则busday_count('2023-10-02', '2023-10-03') = 1(因为计算的是从2号到3号之间的工作日,即周一这一天)
例子2:
收件日期:2023-10-02,结案日期:2023-10-02 → 0天
收件日期:2023-10-02,结案日期:2023-10-04 → 2天(假设3号是假日的话,但这里假设没有节假日)
所以,如果工期是1天,例子1中的情况刚好满足,不超时。如果工期是1天,结案日期是3号,那么1天等于工期,不超时。
但是,如果收件日期是2号,结案日期是3号下午,可能业务上认为已经超过了一个工作日。这个时候是否需要将结束日期加一天?
或者,不管时间,只按日期计算,即结案日期的日期是否在收件日期之后的工作日。例如,如果收件日期是2号,结案日期是3号,无论时间,都算作1个工作日。而如果结案日期是2号同一天,则算作0天。
这可能更符合用户的需求,即按自然日计算,忽略具体时间。因此,使用np.busday_count(start_date, end_date)得到的是两个日期之间的工作日数,不包含end_date。因此,如果需要包含end_date作为一天的话,应该将end_date加1天?
比如,例子1中,如果结束日期是3号,想要算作1天,那么代码正确。但如果业务规则要求,结案日期当天也算作一天,那么可能需要将end_date加1天。例如:
merged_data['工作日天数'] = merged_data.apply(
lambda row: np.busday_count(row['SADate_date'].date(),
(row['paraDate9_filled'] + pd.DateOffset(days=1)).date()),
axis=1
)
这样,在例子1中,结束日期是3号,加1天到4号,计算2号到4号之间的工作日数,即3号这一天,结果是1天。但如果结束日期是3号,而加1天后是4号,假设4号是工作日,则结果为2天?
这似乎不太对。可能我的理解有误。需要重新考虑。
例如,假设开始是2号,结束是3号:
np.busday_count('2023-10-02', '2023-10-03') → 1天(因为包含2号到3号之间的工作日,即只有2号这一天)
如果结束日期是3号,而希望包含3号当天,应该计算到4号,这样结果会是2天(2号和3号)。
所以,正确的做法应该是将结束日期加1天,然后计算之间的工作日数。例如:
start = '2023-10-02'
end = '2023-10-03'
np.busday_count(start, end) → 1(2号)
np.busday_count(start, '2023-10-04') → 2(2号、3号)
这样,如果用户希望包含end_date当天,那么应该将end_date加1天。因此,在代码中,应该将结束日期加1天,然后计算。
因此,代码可能应该如下:
merged_data['工作日天数'] = merged_data.apply(
lambda row: np.busday_count(row['SADate_date'].date(), (row['paraDate9_filled'] + pd.DateOffset(days=1)).date()),
axis=1
)
这样,就能正确包含结束日期当天的工作日。
接下来,处理工期列中的“协商”问题。假设这些行需要特殊处理,或者替换为0。例如:
merged_data['工期'] = merged_data['工期'].replace('协商', 0).astype(int)
或者,如果“协商”不能被转换为数字,需要用pd.to_numeric:
merged_data['工期'] = pd.to_numeric(merged_data['工期'], errors='coerce').fillna(0)
然后,总工期是工期列加上GongQiHuanBan列:
merged_data['总工期'] = merged_data['工期'] + merged_data['GongQiHuanBan']
然后,判断是否超时:
merged_data['是否超时'] = np.where(
merged_data['工作日天数'] >= merged_data['总工期'],
'超时',
'否'
)
同时,计算超时天数:
merged_data['超时天数'] = np.where(
merged_data['是否超时'] == '超时',
merged_data['工作日天数'] - merged_data['总工期'],
np.nan # 或者不填写
)
不过,用户要求当判断结果为超时时,输出超时并计算天数,否则输出否,不需要计算天数。所以超时天数在“否”的情况下可以留空或者设为0,但根据问题描述,应该只在超时时显示天数。因此,使用条件表达式。
但是,还需要注意,当paraDate9为空时,使用程序运行时间来计算。此时,paraDate9_filled会被填充为当前时间。每次运行程序时,如果案件还未结案,这个时间会变化,导致计算结果不同。
最后,将结果写入新的列“是否超时”和“超时天数”。
总结整个处理步骤:
1. 处理工期列中的“协商”,转换为数值,无法转换的设为0。
2. 填充GongQiHuanBan列为0。
3. 转换日期列为datetime,处理paraDate9的空值为当前时间。
4. 计算工作日天数,考虑周末(和节假日,如果有数据的话)。
5. 计算总工期。
6. 判断是否超时,并计算超时天数。
现在,编写代码的大致步骤:
import pandas as pd
import numpy as np
# 假设merged_data已经存在
# 处理工期列
merged_data['工期'] = pd.to_numeric(merged_data['工期'], errors='coerce').fillna(0)
# 处理GongQiHuanBan列的空值
merged_data['GongQiHuanBan'] = merged_data['GongQiHuanBan'].fillna(0)
# 转换日期列为datetime
merged_data['SADate'] = pd.to_datetime(merged_data['SADate'])
merged_data['paraDate9'] = pd.to_datetime(merged_data['paraDate9'], errors='coerce') # 防止无效日期
# 填充paraDate9的空值为当前时间
current_time = pd.Timestamp.now()
merged_data['paraDate9_filled'] = merged_data['paraDate9'].fillna(current_time)
# 计算工作日天数,排除周末和节假日(假设没有节假日数据)
# 将日期规范化,去掉时间部分
merged_data['SADate_date'] = merged_data['SADate'].dt.normalize()
merged_data['paraDate9_filled_date'] = merged_data['paraDate9_filled'].dt.normalize()
# 定义计算工作日的函数
def calculate_workdays(start, end):
if start > end:
return 0
# 将end日期加1天,以包含结束日期当天的判断
return np.busday_count(start.date(), (end + pd.DateOffset(days=1)).date())
merged_data['工作日天数'] = merged_data.apply(
lambda row: calculate_workdays(row['SADate_date'], row['paraDate9_filled_date']),
axis=1
)
# 计算总工期
merged_data['总工期'] = merged_data['工期'] + merged_data['GongQiHuanBan']
# 判断是否超时及计算超时天数
merged_data['是否超时'] = np.where(
merged_data['工作日天数'] >= merged_data['总工期'],
'超时',
'否'
)
merged_data['超时天数'] = np.where(
merged_data['是否超时'] == '超时',
merged_data['工作日天数'] - merged_data['总工期'],
pd.NA # 或者保持为空
)
# 清理中间生成的列(如果需要)
merged_data.drop(['SADate_date', 'paraDate9_filled_date', 'paraDate9_filled'], axis=1, inplace=True)
可能的测试案例:
案例1:
工期=2,GongQiHuanBan=0,SADate=2023-10-02 9:31:28,paraDate9=2023-10-04 10:00:00
则总工期=2,工作日天数=2天(假设2号和3号是工作日,4号可能被计算为加1天后的日期)
例如,如果SADate是2号,paraDate9是4号,那么加1天后到5号,busday_count(2号,5号) → 3天?或者需要检查具体日期。
比如,如果2号是周一,4号是周三,那么加1天后到周四,busday_count(周一, 周四)是3天(周二、周三、周四?)。而实际工作日天数是3天,如果工期是2,那么超时1天。
但用户的需求是比较“结案时间和收件时间之间的工作日”是否大于等于总工期。所以如果实际工作天数大于等于总工期,就超时。所以在这个例子中,3天 >=2 → 超时,超时天数1天。
这可能与预期不符,因为用户可能认为工期是2天,应该在2个工作日内完成。如果结案是在第三个工作日,则超时。
但根据代码中的计算方式,是否包含结束日期可能导致结果不同。所以需要确保计算方法的正确性。
或者,可能应该直接计算开始和结束日期之间的自然工作日天数,包含开始和结束日期。例如,从2号到4号(假设都是工作日),则天数是3天?或者从2号到4号之间的天数?
例如,2号到4号(包含)是3天?或者如果计算的是2号到4号之间的天数,则为2天?
这个问题需要明确,否则计算结果可能有误。此时,可能需要更准确的日期处理。
或者,使用pandas的bdate_range来生成日期范围,然后计算长度:
def calculate_workdays(start, end):
if start > end:
return 0
dates = pd.bdate_range(start=start, end=end)
return len(dates)
这样,start和end都是包含的。例如,start和end都是同一天且为工作日,则返回1。start是周一,end是周二,返回2天。
这可能更符合业务需求,即如果收件时间和结案时间在同一天,算作1天。工期为1天的话,必须当天完成,否则超时。
在这种情况下,修改计算函数:
def calculate_workdays(start, end):
if start > end:
return 0
# 生成从start到end(包含)的工作日范围
dates = pd.bdate_range(start=start, end=end)
return len(dates)
merged_data['工作日天数'] = merged_data.apply(
lambda row: calculate_workdays(row['SADate_date'], row['paraDate9_filled_date']),
axis=1
)
这样,案例中的开始日期为周一,结束日期为周三,则生成周一、周二、周三三个工作日,返回3天。如果总工期是2,则超时1天。
但是,如果收件时间是周一上午,结案时间是周一下午,那么dates会包含周一这一天,返回1天。此时,工期为1天的话,刚好不超时。这可能符合实际业务需求,即当天完成不算超时。
这可能更合理。因此,使用pd.bdate_range的start和end参数,包含两端的工作日。
综上,正确的计算方式应该是使用pd.bdate_range生成日期范围,并计算长度。这样,在代码中处理更为准确。
因此,调整代码中的计算函数:
def calculate_workdays(start, end):
# 确保start和end是Timestamp对象,并且已去除时间部分
if start > end:
return 0
# 生成从start到end(含)的工作日
b_days = pd.bdate_range(start=start, end=end)
return len(b_days)
然后应用到每一行:
merged_data['工作日天数'] = merged_data.apply(
lambda row: calculate_workdays(row['SADate_date'], row['paraDate9_filled_date']),
axis=1
)
这样,就能正确计算包含开始和结束日期的工作日数。
现在,再考虑节假日的问题。如果用户有节假日的列表,例如中国的法定假日,需要排除这些日期。此时,需要使用CustomBusinessDay来创建自定义的工作日历。例如:
from pandas.tseries.offsets import CustomBusinessDay
from pandas import holidays
# 假设holidays_list是节假日列表
holidays_list = ['2025-01-01', '2025-02-10', ...] # 需要用户提供
# 创建自定义工作日历,排除周末(周六、周日)和节假日
custom_bday = CustomBusinessDay(holidays=holidays_list)
def calculate_workdays_custom(start, end):
if start > end:
return 0
# 使用自定义工作日历生成日期范围
b_days = pd.date_range(start=start, end=end, freq=custom_bday)
return len(b_days)
然后,在代码中使用这个函数。但用户没有提供节假日数据,因此无法实现。但问题描述中要求“去除节假日”,所以必须处理。如果用户没有提供,可能需要提示需要节假日数据,或者假设没有节假日,只排除周末。
因此,在当前的解决方案中,假设没有节假日数据,只排除周末。如果有节假日数据,需要用户提供,并调整代码。
综上,最终的代码应该包括处理工期列中的“协商”,填充GongQiHuanBan,转换日期,计算工作日数(排除周末),比较总工期,判断是否超时,并计算天数。</think>让我们分步解决这个问题:
### 一、数据预处理
```python
# 处理工期列中的"协商"(替换为0)
merged_data['工期'] = pd.to_numeric(merged_data['工期'], errors='coerce').fillna(0)
# 填充工期暂停时间
merged_data['GongQiHuanBan'] = merged_data['GongQiHuanBan'].fillna(0)
# 转换日期格式
merged_data['SADate'] = pd.to_datetime(merged_data['SADate'])
merged_data['paraDate9'] = pd.to_datetime(merged_data['paraDate9'])
```
### 二、结案时间处理
```python
# 填充空结案时间为当前时间
current_time = pd.Timestamp.now()
merged_data['effective_end_date'] = merged_data['paraDate9'].fillna(current_time)
```
### 三、工作日计算函数
```python
def calculate_workdays(start, end):
"""
计算两个日期之间的工作日数(排除周末)
输入参数需要是pd.Timestamp类型
"""
if start > end:
return 0
return len(pd.bdate_range(start=start.normalize(),
end=end.normalize()))
```
### 四、执行计算
```python
# 计算工作日天数
merged_data['工作日天数'] = merged_data.apply(
lambda row: calculate_workdays(row['SADate'], row['effective_end_date']),
axis=1
)
# 计算总工期
merged_data['总工期'] = merged_data['工期'] + merged_data['GongQiHuanBan']
# 判断超时
merged_data['是否超时'] = np.where(
merged_data['工作日天数'] >= merged_data['总工期'],
'超时',
'否'
)
# 计算超时天数
merged_data['超时天数'] = np.where(
merged_data['是否超时'] == '超时',
merged_data['工作日天数'] - merged_data['总工期'],
pd.NA
)
```
### 五、最终结果示例
| SADate | paraDate9 | 工期 | GongQiHuanBan | 工作日天数 | 总工期 | 是否超时 | 超时天数 |
|-----------------|-----------------|------|---------------|------------|--------|----------|----------|
| 2025-01-02 09:31 | 2025-01-04 10:00 | 2 | 0 | 3 | 2 | 超时 | 1 |
| 2025-02-01 08:00 | NaT | 5 | 2 | 8 | 7 | 超时 | 1 |
| 2025-03-10 14:30 | 2025-03-11 09:00 | 3 | 1 | 2 | 4 | 否 | - |
### 六、注意事项
1. **节假日处理**:当前代码仅排除周末,如需排除法定节假日,需要提供节假日列表并修改`calculate_workdays`函数
2. **时间敏感性**:未结案案件的计算结果会随程序运行时间变化
3. **特殊值处理**:工期列的文本值(如"协商")已被强制转换为0,需根据业务需求确认是否合理
完整代码需要配合具体数据验证,建议先用测试数据验证计算逻辑的正确性。
阅读全文
相关推荐



















