繁体   English   中英

在 R 中按日期从时间序列中选择一个值

[英]Select a value from time series by date in R

如何从对应所需日期的时间序列中选择一个值?

我用命令创建了一个每月的时间序列对象:

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

然后我尝试做下一步:

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

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

[1] NA

而不是10396.8212805739如果 producer.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")

因此,我有一个类似的问题,并且一直在寻找解决方案。 我的解决方案不如我期望的那样好,但是它可以工作。 我用您的数据进行了测试,结果似乎正确。

说明

事实证明,R时间序列中的数据实际上是从1开始而不是与yout 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]

如果您需要时间计算方面的帮助,请查看此答案。您将需要zoolubridate软件包。以星期,月份,季度和年为单位获取日期之间的差额

希望能帮助到你 :)

1)window.ts

window.ts函数用于按时间窗口子集"ts"时间序列。 window命令产生一个带有一个数据点的时间序列,[[1]]使它成为一个直接的数值:

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

2)动物园我们可以交替将其转换为动物园和由yearmon类变量下标,然后使用[[1]]或coredata将其转换为一个普通的数目或者我们可以使用window.zoo就像我们做了很多window.ts

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.xts ,则(2)中的as.zoo也将as.xts

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM