我有一个包含两列的数据框(DF)。在第一列中我有日期,在第二列中我有我感兴趣的价值(VOI)。
DF的显示是这样的:
|---------------------|------------------|
| Date | VOI |
|---------------------|------------------|
| Jan-1971 | 34 |
|---------------------|------------------|
| Jan-1972 | 28 |
|---------------------|------------------|
| Jan-1973 | 29 |
|---------------------|------------------|
| Jan-1974 | 37 |
|---------------------|------------------|
| ... | ... |
|---------------------|------------------|
| Jan-2017 | 36 |
|---------------------|------------------|
| Fev-1971 | 48 |
|---------------------|------------------|
| Fev-1972 | 49 |
|---------------------|------------------|
| Fev-1973 | 52 |
|---------------------|------------------|
| Fev-1974 | 50 |
|---------------------|------------------|
| ... | ... |
|---------------------|------------------|
| Mar-1971 | 30 |
|---------------------|------------------|
| ... | ... |
|---------------------|------------------|
| Mar-2017 | 36 |
|---------------------|------------------|
| ... | ... |
|---------------------|------------------|
| Dez-1971 | 15 |
|---------------------|------------------|
| ... | ... |
|---------------------|------------------|
| Dez-2017 | 19 |
|---------------------|------------------|
简而言之,数据以汇总的月数周期呈现。
首先,我拥有1971年至2017年1月份的所有VOI(47个数据点),然后我获得了同期2月份的所有VOI,因此得分相同。这种重复持续到12月,也有47个数据点。
我从 lubridate 应用了 ymd(),将我的日期转换为POSIXct值。
现在我想从我的VOI中创建一个时间序列对象。我试过了:
ts = xts(x = df$Vazao, order.by = index(df$Date))
和
ts = xts(x = df$Vazao, order.by = df$Data)
但没有效果。我不知道我在哪里犯了一个错误,但我想知道这与我的日期不是按时间顺序排列有关。我认为使用 ymd()命令可以对此进行排序并“让R理解”我的时间序列从1971年1月,1971年2月,1971年3月,2017年12月开始。
如何将此数据框转换为时间序列对象?
感谢您的投入。
答案 0 :(得分:2)
这是你在找什么?
首先,编制一些数据。
y <- 1971:2017
length(ano)
m <- seq(as.Date("2017-01-01"), as.Date("2017-12-31"), by = 28)
m <- unique(format(m, "%b"))
Date <- expand.grid(y, m)[2:1]
Date <- apply(Date, 1, paste, collapse = "-")
DF <- data.frame(Date = date, VOI = sample(100, length(date), TRUE))
head(DF)
# Date VOI
#1 Jan-1971 12
#2 Jan-1972 89
#3 Jan-1973 99
#4 Jan-1974 77
#5 Jan-1975 5
#6 Jan-1976 46
现在,只需将函数xts
与适当的参数一起使用即可。请注意,您的Date
列没有day
值,因此我必须paste
一列。第01
天总是一个不错的选择。
library(xts)
ts <- xts(DF[, "VOI"], order.by = as.Date(paste0("01-", DF$Date), "%d-%b-%Y"))
str(ts)
#An ‘xts’ object on 1971-01-01/2017-12-01 containing:
# Data: int [1:564, 1] 76 90 7 61 3 49 1 19 51 90 ...
# Indexed by objects of class: [Date] TZ: UTC
# xts Attributes:
# NULL
head(ts)
[,1]
#1971-01-01 76
#1971-02-01 90
#1971-03-01 7
#1971-04-01 61
#1971-05-01 3
#1971-06-01 49
答案 1 :(得分:1)
由于您的Date
仅获得month
和year
日期,因此您可以使用zoo::yearmon
函数将Date
转换为类{{1}这是yearmon
函数可以接受的。
解释了对
xts
order.by
参数的期望 在帮助中:xts对象从同一个包中扩展S3类zoo 名。
此扩展的第一个区别提供了一个要求 索引值不仅是唯一的和有序的,而且必须是a 基于时间的课程。 目前可接受的课程包括:
xts
,Date
,POSIXct
,以及timeDate
和yearmon
索引值保持唯一。
解决方案可以是:
yearqtr