如何在R中基于时间戳计算并提取分钟级大宗商品价格的开高低收值
实现方案
这里提供两种常用实现方式,高频大数据场景优先选择data.table版本,运行效率更高。
方法1:data.table 版本(推荐大数据量使用)
# 加载依赖包 library(data.table) library(lubridate) # 1. 读取数据,fread对大文件读取效率远高于基础read函数 dt <- fread("你的数据文件路径.csv") # 2. 合并日期时间字段生成完整时间戳,同时生成分钟级分组标识 dt[, full_datetime := ymd_hms(paste(Date, Time))] dt[, minute_group := floor_date(full_datetime, unit = "minute")] # 3. 按分钟分组计算目标指标 result <- dt[, .( Date = format(minute_group, "%Y%m%d"), Time = format(minute_group, "%H:%M:%S"), Start = first(Price), End = last(Price), Low = min(Price, na.rm = T), High = max(Price, na.rm = T) ), by = minute_group] # 4. 移除冗余分组列,得到最终结果 result[, minute_group := NULL]
方法2:tidyverse 版本
# 加载依赖包 library(tidyverse) library(lubridate) # 读取数据 df <- read_csv("你的数据文件路径.csv") # 数据处理与聚合 result <- df %>% mutate( full_datetime = ymd_hms(paste(Date, Time)), minute_group = floor_date(full_datetime, unit = "minute") ) %>% group_by(minute_group) %>% summarise( Date = format(minute_group, "%Y%m%d"), Time = format(minute_group, "%H:%M:%S"), Start = first(Price), End = last(Price), Low = min(Price, na.rm = TRUE), High = max(Price, na.rm = TRUE) ) %>% ungroup() %>% select(-minute_group)
注意事项
- 运行前需确认原始数据是按时间正序排列的,
first()和last()才会返回正确的首尾价格;如果数据顺序不确定,可以先按full_datetime排序再执行聚合 - 若数据中存在空值,
na.rm = T参数会自动跳过空值计算极值,无缺失值可删除该参数 - 结果导出可直接使用
fwrite(result, "输出文件路径.csv")或者write_csv(result, "输出文件路径.csv")
内容的提问来源于stack exchange,提问作者Hawky
相关产品推荐
相关产品推荐

