计算工作日
library(tidyverse)
# 定义节假日和补班日
holidays_2024 <- as.Date(c(
"2024-01-01", # 元旦
"2024-02-10", "2024-02-11", "2024-02-12", "2024-02-13", "2024-02-14", "2024-02-15", "2024-02-16", # 春节
"2024-04-04", "2024-04-05", "2024-04-06", # 清明节
"2024-05-01", "2024-05-02", "2024-05-03", # 劳动节
"2024-06-08", "2024-06-09", "2024-06-10", # 端午节
"2024-09-15", "2024-09-16", "2024-09-17", # 中秋节
"2024-10-01", "2024-10-02", "2024-10-03", "2024-10-04", "2024-10-05", "2024-10-06", "2024-10-07" # 国庆节
))
workdays_2024 <- as.Date(c(
"2024-02-04", "2024-02-18", # 春节补班
"2024-04-07", # 清明补班
"2024-04-28", "2024-05-11", # 劳动节补班
"2024-06-02", # 端午补班
"2024-09-14", "2024-09-29", # 中秋补班
"2024-10-12" # 国庆补班
))
# 改进的工作日计算函数
count_workdays <- function(start_date, end_date, holidays = holidays_2024, makeup_days = workdays_2024) {
# 处理NA或无效日期
if (is.na(start_date) || is.na(end_date)) return(NA_real_)
if (start_date > end_date) return(0)
# 创建日期序列并计算工作日
dates <- seq(start_date, end_date, by = "day")
# 如果没有日期(相同日期情况),返回0
if (length(dates) <= 1) return(0)
# 计算工作日
tibble(date = dates) %>%
mutate(
is_weekend = wday(date) %in% c(1, 7), # 1 = 周日, 7 = 周六
is_holiday = date %in% holidays,
is_makeup = date %in% makeup_days,
is_workday = (!is_weekend | is_makeup) & !is_holiday
) %>%
summarise(workdays = sum(is_workday)) %>%
pull(workdays)
}
# 读取数据并处理
data <- read.csv("标本状态一览表2024.4.1-2024.12.29.csv", header = TRUE, fileEncoding = "GBK") %>%
mutate(
合格毒株 = NA_real_,
县区合并市州 = NA_character_,
工作日 = NA_real_
) %>%
relocate(合格毒株, .after = "分离单位") %>%
relocate(县区合并市州, .after = "收样单位") %>%
relocate(工作日, .after = "采集日期") %>%
# 处理检测日期和结果
mutate(
# 处理NA值
`REAL_TIME检测日期` = replace_na(`REAL_TIME检测日期`, ""),
`RTPCR检测日期` = replace_na(`RTPCR检测日期`, ""),
# 填充空的REAL_TIME检测日期
`REAL_TIME检测日期` = if_else(`REAL_TIME检测日期` == "", `RTPCR检测日期`, `REAL_TIME检测日期`),
# 填充检测结果
`REAL_TIME检测结果.新冠病毒` = if_else(`REAL_TIME检测结果.新冠病毒` == "",
`RT.PCR检测结果.新冠病毒`,
`REAL_TIME检测结果.新冠病毒`),
# 更新县区合并市州列
县区合并市州 = case_when(
收样单位 %in% c("民勤县疾病预防控制中心", "古浪县疾病预防控制中心") ~ "武威市疾病预防控制中心",
收样单位 == "甘谷县疾病预防控制中心" ~ "天水市疾病预防控制中心",
TRUE ~ 收样单位
)
) %>%
# 更安全地转换日期格式
mutate(
采集日期 = as.Date(gsub("/", "-", as.character(采集日期))),
`REAL_TIME检测日期` = as.Date(gsub("/", "-", as.character(`REAL_TIME检测日期`)))
) %>%
# 计算工作日
mutate(工作日 = map2_dbl(采集日期, `REAL_TIME检测日期`, count_workdays))
# 显示结果的前几行
head(data)
评论
发表评论