You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成指定日期起小时序列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:09