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]
如果您在时间计算方面需要帮助,请查看此答案
您将需要 zoo
和 lubridate
包
Get 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))
如何从时间序列中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]
如果您在时间计算方面需要帮助,请查看此答案
您将需要 zoo
和 lubridate
包
Get 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))