生成指定日期起小时序列df时丢失小时的问题及需求
解决夏令时/冬令时变更导致的小时序列完整性标记问题
你用以下代码生成指定日期到当前时间的小时序列DataFrame时,会遇到夏令时转夏令时的时间变更日缺失1条记录(如2023-03-26缺少02:00:00),按每日24条的标准会误判这类日期为数据不完整。需要新增一列标记值:当日观测数为24,或观测数为23且是时间变更日时标记为1,其余情况标记为0。
# 加载lubridate包(处理时间更便捷,未安装先运行 install.packages("lubridate")) library(lubridate) # 生成基础小时序列 df.ref <- data.frame(Data = seq(as.POSIXct("2020-11-25 18:00:00"), now(), by = "hour")) # 提取本地日期用于按日分组 df.ref$date <- as.Date(df.ref$Data) # 统计每日观测数量并合并回原数据 daily_count <- aggregate(. ~ date, data = df.ref, FUN = length) colnames(daily_count)[2] <- "daily_n" df.ref <- merge(df.ref, daily_count, by = "date") # 判断是否为时间变更日:通过本地日期对应的UTC时长是否不等于24小时识别 df.ref$is_dst_change <- sapply(df.ref$date, function(d) { start_utc <- as.POSIXct(paste(d, "00:00:00"), tz = Sys.timezone()) |> with_tz("UTC") end_utc <- as.POSIXct(paste(d + 1, "00:00:00"), tz = Sys.timezone()) |> with_tz("UTC") difftime(end_utc, start_utc, units = "hours") != 24 }) # 生成最终完整性标记列 df.ref$complete_flag <- ifelse(df.ref$daily_n == 24 | (df.ref$daily_n == 23 & df.ref$is_dst_change), 1, 0) # 可选:移除中间辅助列,保留核心数据 df.ref <- df.ref[, c("Data", "complete_flag")]
代码说明
- 借助
lubridate的时区转换功能,通过UTC时长判断时间变更日,无需硬编码固定变更日期,适配每年变动的夏令时/冬令时切换节点。 - 合并每日观测数后,通过逻辑判断生成标记列,既覆盖正常完整的24条记录日期,也正确标记因时间变更导致的23条记录日期。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

