【问题标题】:How can I transform a dataframe with POSIXct dates into a time series?如何将具有 POSIXct 日期的数据框转换为时间序列?
【发布时间】:2018-11-01 13:17:03
【问题描述】:

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

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

感谢您的意见。

【问题讨论】:

  • 您应该输入数据样本。

标签: r time-series lubridate


【解决方案1】:

因为,您的Date 只得到monthyear 的日期,因此您可以使用zoo::yearmon 函数将Date 转换为yearmon 类,这是xts 函数可以接受的。

解释了xtsorder.by 参数的期望 在帮助中:

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

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

解决方案可以是:

# Sample data. This data will have Date in `Jan-1971` format.
# Data has been created only for 36 months.  
set.seed(1)
df <- data.frame( Date = format(seq(as.Date("1971-01-01"), 
                     as.Date("1973-12-31"), by="month"), "%b-%Y"),
            VOI = as.integer(runif(36)*100), stringsAsFactors = FALSE)


library(zoo)    
library(xts)


#Convert Date column to type `yearmon`
ts = xts(x = df$VOI, order.by = as.yearmon(df$Date, "%b-%Y"))

head(ts)
# [,1]
# Jan 1971   26
# Feb 1971   37
# Mar 1971   57
# Apr 1971   90
# May 1971   20
# Jun 1971   89

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 2021-12-27
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多