R中15分钟分辨率时序数据创建ts对象的start参数设置
正确将15分钟分辨率时间序列转换为ts对象的方法
你遇到的核心问题是ts对象的start参数需要用「年份+年内周期数」的格式,而不是直接传入完整的日期时间——虽然你写start=c(2019, 01, 04, 19, 45)没报错,但ts只会读取前两个元素(2019和1),这会导致时间序列的起始点被错误设置为2019年的第1个15分钟间隔(也就是2019-01-01 00:00:00),和你的实际数据起始时间不符。
步骤1:计算年内起始周期数
ts的freq参数你已经算对了:365*24*60/15 = 35040,代表一年有35040个15分钟间隔。接下来需要计算2019-01-04 19:45:00是2019年的第几个15分钟间隔:
我们可以用lubridate包简化计算(如果没装的话先运行install.packages("lubridate")):
library(lubridate) # 定义数据起始时间 start_time <- ymd_hms("2019-01-04 19:45:00") start_year <- year(start_time) # 计算从当年元旦到起始时间的分钟数,再转换为15分钟间隔数 minutes_since_new_year <- as.duration(start_time - ymd(paste(start_year, "01-01", sep = "-"))) / dminutes(1) start_period <- minutes_since_new_year / 15 + 1 # +1是因为ts的周期从1开始计数
计算结果是start_period = 367,也就是说2019-01-04 19:45:00是2019年的第367个15分钟间隔。
步骤2:创建正确的ts对象
现在用计算好的start参数生成ts对象:
# 读取数据(修正分隔符参数) x <- 'Timestamp,X 2019-01-04 19:45:00,-11.9 2019-01-04 20:00:00,-16.88 2019-01-04 20:15:00,-15.48 2019-01-04 20:30:00,-19.85 2019-01-04 20:45:00,-19.85 2019-01-04 21:00:00,-13.65 2019-01-04 21:15:00,-19.71 2019-01-04 21:30:00,-15.47 2019-01-04 21:45:00,-11.73 2019-01-04 22:00:00,-18.68 2019-01-04 22:15:00,-9.51 2019-01-04 22:30:00,-19.25 2019-01-04 22:45:00,-19.51 2019-01-04 23:00:00,-19.64 2019-01-04 23:15:00,-19.7 2019-01-04 23:30:00,-19.53 2019-01-04 23:45:00,-17.67 2019-01-05 00:00:00,-19.22 2019-01-05 00:15:00,-19.11 2019-01-05 00:30:00,-19.15 2019-01-05 00:45:00,-19.22 2019-01-05 01:00:00,-15.48 2019-01-05 01:15:00,-11.46 2019-01-05 01:30:00,-19.55 2019-01-05 01:45:00,-19.43 2019-01-05 02:00:00,-18.66 2019-01-05 02:15:00,-18.46 2019-01-05 02:30:00,-15.54 2019-01-05 02:45:00,-17.41' df <- read.csv(text=x, sep=" ") # 指定空格分隔,避免读取错误 # 生成ts对象 freq <- 365*24*60/15 my.ts <- ts(df$X, freq = freq, start = c(start_year, start_period)) / 1000
验证正确性
你可以用start(my.ts)查看起始周期,输出应该是[1] 2019.0103——这个小数代表2019年的第367/35040个周期,换算后正好对应你的起始时间。
替代方案:用xts/zoo处理时间序列
如果觉得ts的周期计算太麻烦,更推荐用xts或zoo包,它们可以直接用原始时间戳,不需要手动计算周期:
library(xts) my.xts <- xts(df$X/1000, order.by = ymd_hms(df$Timestamp)) # 查看前3条数据 head(my.xts, 3)
输出会直接显示对应的时间戳,更直观,而且处理跨闰年的情况也更灵活。
内容的提问来源于stack exchange,提问作者Sreeram TP
相关产品推荐
相关产品推荐

