如何将具有POSIXct日期的数据框转换为时间序列?

时间:2018-05-22 17:19:54

标签: r time-series lubridate

我有一个包含两列的数据框(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月开始。

  

如何将此数据框转换为时间序列对象?

感谢您的投入。

2 个答案:

答案 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仅获得monthyear日期,因此您可以使用zoo::yearmon函数将Date转换为类{{1}这是yearmon函数可以接受的。

  

解释了对xts order.by参数的期望   在帮助中:

     

xts对象从同一个包中扩展S3类zoo   名。

     

此扩展的第一个区别提供了一个要求   索引值不仅是唯一的和有序的,而且必须是a   基于时间的课程。 目前可接受的课程包括: xts,   DatePOSIXct,以及timeDateyearmon   索引值保持唯一。

解决方案可以是:

yearqtr