R语言处理英国夏令时切换xts时间序列缺失与时间过滤异常
英国夏令时/冬令时切换场景下的时间序列处理方案
问题背景
数据处理过程中发现英国夏季GMT夏令时切换节点存在时间序列数据缺失,冬季冬令时切换节点存在同类问题,需解决两个核心技术需求:
- 基于xts格式数据表,补全切换节点缺失的时间序列
- 补全后按时间条件准确筛选目标记录,解决筛选逻辑返回异常结果的问题
1. xts格式时间序列补全实现
夏令时切换时英国本地时间(Europe/London时区)会直接跳过1小时(3月最后一个周日凌晨1点直接跳转至2点,无01:00-01:59的本地时间),直接用本地时区生成时间序列会自动跳过不存在的时间点,补全过程需以无时区跳变的UTC时间作为中间基准:
library(xts) library(lubridate) # 全局指定处理时区为英国本地时间,避免系统默认时区干扰 Sys.setenv(TZ = "Europe/London") # 步骤1:将起止时间转换为UTC时区,生成无跳变的完整2分钟间隔时间轴 start_utc <- with_tz(as.POSIXct("2022-03-27 00:58:00", tz = "Europe/London"), tzone = "UTC") end_utc <- with_tz(as.POSIXct("2022-03-27 03:00:00", tz = "Europe/London"), tzone = "UTC") full_time_utc <- seq(from = start_utc, to = end_utc, by = "2 min") # 步骤2:将完整UTC时间轴转换回英国本地时间,和原始xts数据对齐补全 full_time_local <- with_tz(full_time_utc, tzone = "Europe/London") full_index_xts <- xts(, order.by = full_time_local) # 假设原始xts对象名为raw_xts,merge后自动对齐时间轴,缺失位置为NA completed_xts <- merge(raw_xts, full_index_xts) # 缺失值可根据业务规则填充,示例为前向填充 completed_xts <- na.locf(completed_xts)
注:冬季冬令时切换时会出现1小时重复本地时间(10月最后一个周日凌晨2点倒回1点),用上述UTC时间轴的方法同样可以避免时间重复错位问题。
2. 时间筛选结果异常修复
执行筛选代码返回全部数据的核心原因:ymd_hms()默认生成UTC时区的时间对象,和数据集里Europe/London时区的TIMESTAMP列时区不匹配,夏令时切换当天的时间偏移导致大小比较逻辑完全失效。
修复方法为给筛选阈值指定和数据列完全一致的时区,代码如下:
library(dplyr) library(lubridate) a <- missing_timestamp %>% filter( TIMESTAMP > ymd_hms("2022-03-27 00:00:00", tz = "Europe/London"), TIMESTAMP < ymd_hms("2022-03-27 02:06:00", tz = "Europe/London") )
执行后将正确返回00:00-02:06区间内的前4条记录,不会出现全量返回的问题。
内容的提问来源于stack exchange,提问作者Aravindan Kalai
相关产品推荐
相关产品推荐

