Select R 中按日期的时间序列值

Select a value from time series by date in R

如何从时间序列中select一个值对应需要的日期?

我使用以下命令创建每月时间序列对象:

producers.price <- ts(producers.price, start=2012+0/12, frequency=12)

那我试着做下一步:

value <- producers.price[as.Date("01.2015", "%m.%Y")]

但这并不能使我想要和值相等

[1] NA

而不是 10396.8212805739 如果 producers.price 是:

producers.price <- structure(c(7481.52109434237, 6393.18959031561, 6416.63065650718, 
                  5672.08354710121, 7606.24186413516, 5201.59247092013, 6488.18361474813, 
                  8376.39182893415, 9199.50916585545, 8261.87133079494, 8293.8195347453, 
                  8233.13630279516, 7883.17272003961, 7537.21001580393, 6566.60260432381, 
                  7119.99345843556, 8086.40101607729, 9125.11104610046, 10134.0228610828, 
                  10834.5732454454, 9410.35031874371, 9559.36933274129, 9952.38679679724, 
                  10390.3628690951, 11134.8432864557, 11652.0075507499, 12626.9616107684, 
                  12140.6698452193, 11336.8315981684, 10526.0309052316, 10632.1492109584, 
                  8341.26367412737, 9338.95688558448, 9732.80173656971, 10724.5525831506, 
                  11272.2273444623, 10396.8212805739, 10626.8428853062, 11701.0802817581, 
                  NA), .Tsp = c(2012, 2015.25, 12), class = "ts")

所以,我 had/have 遇到了类似的问题,正在四处寻找解决办法。我的解决方案没有我想要的那么好,但它确实有效。我用你的数据试过了,它似乎给出了正确的结果。

说明

事实证明,在 R 中,时间序列数据确实存储为一个序列,从 1 开始,而不是从你的 T 开始。例如。如果您有一个从 1950 年开始到 1960 年结束的时间序列,每个数据间隔一年,则 1950 年的 Y 将为 ts[1],而 1960 年的 Y 将为 ts[11]。 基于此逻辑,您需要从数据的开头减去日期并加 1 以获得该点的值。

R 中的这段代码可以为您提供预期的结果。

producers.price[((as.yearmon("2015-01")- as.yearmon("2012-01"))*12)+1]

如果您在时间计算方面需要帮助,请查看此答案 您将需要 zoolubridateGet the difference between dates in terms of weeks, months, quarters, and years

希望对您有所帮助:)

1) window.ts

window.ts 函数用于按时间 window 对 "ts" 时间序列进行子集化。 window 命令生成一个具有一个数据点的时间序列,[[1]] 使其成为一个直接数值:

window(producers.price, start = 2015 + 0/12, end = 2015 + 0/12)[[1]]
## [1] 10396.82

2) zoo 我们可以交替将其转换为 zoo 并用 yearmon class 变量下标,然后使用 [[1]] 或 coredata 将其转换为普通数字,或者我们可以像使用 window.ts 一样使用 window.zoo :

library(zoo)

as.zoo(producers.price)[as.yearmon("2015-01")][[1]]
## [1] 10396.82

coredata(as.zoo(producers.price)[as.yearmon("2015-01")])
## [1] 10396.82

window(as.zoo(producers.price), 2015 + 0/12 )[[1]]
## [1] 10396.82

coredata(window(as.zoo(producers.price), 2015 + 0/12 ))
## [1] 10396.82

3) xts 如果 library(zoo) 替换为 library(xts) 并且 as.zoo 替换为 as.zoo,则 (2) 中的四行也有效as.xts.

寻找一个简单的命令,一行且不需要库? 你可以试试这个。

as.numeric(window(producers.price, 2015.1, 2015.2))