将不规则时间序列转换为常规时间序列

Jan*_*nvb 9 datetime r time-series

将不规则时间序列转换为常规时间序列时遇到问题.下面是一个简化的例子:

require(zoo)
t <- as.character(c(1981,1984,1985))
d <- c(1,3,6)
dt <- data.frame(d,t)
t <- as.Date(t,"%Y")
z <- zoo(d,t)
plot(z)
ts.d <- as.ts(as.zooreg(z,freq=1)) # create a regular ts object
ts.d # regular time series
Run Code Online (Sandbox Code Playgroud)

我想创建一个看起来像这个c(1981,NA,NA,1984,1985)的常规时间序列ts.d.

令人惊奇的是,我第一次运行它:它的工作原理!但是当我想再次运行它或重复它(as.ts()行)它会停止工作并且我获得了很长的时间序列:

ts.d # regular time series
Time Series:
Start = 4299 
End = 5760 
Frequency = 1 
  [1]  1 NA NA NA NA NA NA NA NA NA NA NA NA NA
 [15] NA NA NA NA NA NA NA NA 
Run Code Online (Sandbox Code Playgroud)

等等

出了什么问题?

G. *_*eck 7

正如已经指出的那样as.Date(as.character(t), "%Y")是不正确的,因为它没有给出所需的月和日.如果我们想把几年转换成"Date"课堂,我们可以as.Date(as.yearmon(t))用动物园做到这一点as.yearmon; 然而,那么我们会有另一个问题,即不同的年份有不同的天数,所以没有办法定期使用日期表示年份.

真的,我们首先不想要约会.我们只想与多年合作,在这种情况下,它简化为:

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985))
> 
> as.ts(z)
Time Series:
Start = 1981 
End = 1985 
Frequency = 1 
[1]  1 NA NA  3  6
Run Code Online (Sandbox Code Playgroud)

或者如果我们想要安全,我们可以做到这一点,这将迫使它成为年度,即使输入偶然有一个较低的频率:frequency(z) <- 1; as.ts(z)或者只是定义原始动物园系列从一开始的频率为1:

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985), frequency = 1)
> as.ts(z)
Time Series:
Start = 1981 
End = 1985 
Frequency = 1 
[1]  1 NA NA  3  6
Run Code Online (Sandbox Code Playgroud)

在这个例子中,它没有什么区别,但在这种情况下 z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1),frequency需要显式来防止它具有频率0.5.