计算工作日

 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)


评论

此博客中的热门博文

V2ray websocket(ws)+tls+nginx分流

Rstudio 使用代理