我需要从100毫秒时间序列聚合1秒时间序列。我在R xts中使用函数to.period()
,首先将数据转换为xts格式。
错误是:不支持的类型。
x <- xts(data, order.by = as.POSIXct(data$Time, format = "%H:%M:%S.%ms"))
to.period(x, period = "seconds", k=1)
Error in to.period(x, period = "seconds", k = 1) : unsupported type
当我尝试使用句号=分钟和更高时,会出现相同的错误。
Date Time Price Amount
<NA> "2014/10/26" "17:30:12.500" "1.268" "1000000"
<NA> "2014/10/26" "17:33:28.900" "1.268" "1000000"
<NA> "2014/10/26" "17:33:52.600" "1.268" "1000000"
Mac OS
这是错误,因为我的数据是毫秒格式还是有其他原因?我该怎么做才能解决错误?
答案 0 :(得分:3)
您的代码存在一些问题。我建议你花几分钟时间阅读动物园和xts小插曲,以便更好地理解这两个类。
假设您的data
看起来像:
data <- structure(list(Date = c("2014/10/26", "2014/10/26", "2014/10/26"),
Time = c("17:30:12.500", "17:33:28.900", "17:33:52.600"),
Price = c(1.268, 1.268, 1.268), Amount = c(1000000L, 1000000L, 1000000L)),
.Names = c("Date", "Time", "Price", "Amount"), class = "data.frame",
row.names = c(NA, -3L))
您对xts
构造函数的调用无效。
x <- xts(data, order.by = as.POSIXct(data$Time, format = "%H:%M:%S.%ms"))
data$Time
只是一个时间,而不是日期时间,所以as.POSIXct
将使用今天的日期。但这不起作用,因为您错误地指定了格式("%ms"
不是有效格式,请参阅?strptime
),这会导致所有结果值为NA
。
即使在纠正了这两个问题之后,你的代码仍然无效,因为data
包含几种类型的数据(字符(因子?),double,integer),而xts对象是具有索引属性的矩阵,并且你不能在矩阵中混合类型。因此,您需要从xts对象的coredata中排除日期和时间列。您需要正确指定format
的{{1}}参数。
as.POSIXct
现在x <- xts(data[,c("Price", "Amount")],
order.by=as.POSIXct(paste(data$Date, data$Time), format="%Y/%m/%d %H:%M:%OS"))
将起作用:
to.period
如果要将Amount列聚合为volume,则需要在调用to.period(x, "seconds")
# x.Open x.High x.Low x.Close
# 2014-10-26 17:30:12 1.268 1.268 1.268 1.268
# 2014-10-26 17:33:28 1.268 1.268 1.268 1.268
# 2014-10-26 17:33:52 1.268 1.268 1.268 1.268
之前重命名它。
to.period