在R中对POSIXct变量进行非等时间过滤的技术问询
POSIXct日期时间的时间过滤与高效hms提取
首先加载示例数据:
apple_data <- structure(list(SYMBOL = structure(c("AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL"), label = "Stock Symbol"), DATE = structure(c(14246, 14246, 14246, 14246, 14246, 14246, 14246, 14246, 14246, 14246), label = "Quote date", format.sas = "YYMMDDN8", class = "Date"), TIME = structure(c(34200, 34201, 34202, 34203, 34204, 34205, 34206, 34207, 34208, 34209), class = c("hms", "difftime"), units = "secs"), BB = structure(c(85.55, 85.6, 85.56, 85.55, 85.57, 85.56, 85.61, 85.61, 85.62, 85.62), label = "Best Bid"), BO = structure(c(85.6, 85.86, 85.66, 85.66, 85.8, 85.66, 85.66, 85.66, 85.73, 85.73 ), label = "Best Offer"), date_time = structure(c(1230888600, 1230888601, 1230888602, 1230888603, 1230888604, 1230888605, 1230888606, 1230888607, 1230888608, 1230888609), tzone = "UTC", format.sas = "DATETIME20", class = c("POSIXct", "POSIXt"))), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
问题1:仅通过POSIXct变量进行时间范围过滤
无需拆分DATE和TIME变量,有两种高效实现方式:
方法1:提取时间分量直接判断
利用lubridate包的时间分量函数,组合条件过滤:
library(dplyr) library(lubridate) apple_data %>% filter( hour(date_time) == 9, minute(date_time) == 30, between(second(date_time), 3, 5) )
方法2:提取hms类型后过滤
直接用hms::as_hms()从POSIXct提取时间部分,逻辑与单独TIME变量一致:
library(hms) apple_data %>% filter( as_hms(date_time) >= as_hms("09:30:03"), as_hms(date_time) <= as_hms("09:30:05") )
问题2:快速获取hms类型时间,避免字符串转换开销
直接从POSIXct转换为hms类型是最优方案,hms::as_hms()支持直接接收POSIXct对象,内部基于底层数值计算(POSIXct本质是epoch秒数),完全避免字符串处理的高开销:
# 直接从POSIXct提取hms apple_data <- apple_data %>% mutate(time_hms = as_hms(date_time)) # 验证结果类型 class(apple_data$time_hms) #> [1] "hms" "difftime"
大数据场景效率对比
字符串中转的方式在大数据量下耗时显著更高,可通过microbenchmark验证:
library(microbenchmark) # 构造10万行的大数据集 big_data <- apple_data %>% slice(rep(1:n(), 10000)) # 测试两种转换方式的耗时 microbenchmark( 直接转换 = as_hms(big_data$date_time), 字符串中转 = as_hms(format(big_data$date_time, "%T")), times = 10 )
运行结果会显示直接转换的耗时仅为字符串中转方式的几分之一,同时得到的hms类型可直接用于数据合并等操作。
内容的提问来源于Stack Exchange,提问作者Matthew Son
相关产品推荐
相关产品推荐

