Как я могу преобразовать фрейм данных с датами POSIXct во временной ряд? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть фрейм данных (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       |
|---------------------|------------------|

В двух словах, данные представлены вагрегированные циклы месяцев.

Сначала у меня есть все VOI за январь с 1971 по 2017 год (47 точек данных), затем у меня есть все VOI за февраль того же периода, следовательно, одинаковое количество очков.Это повторение продолжается до декабря, также с 47 точками данных.

Я применил ymd () из lubridate , чтобы преобразовать мою дату в значения POSIXct.

Теперь я хотел создать объект временного ряда из моих VOI.Я пытался:

ts = xts(x = df$Vazao, order.by = index(df$Date))

и

ts = xts(x = df$Vazao, order.by = df$Data)

, но ни один не работал.Я не знаю, где я совершаю ошибку, но мне интересно, что это как-то связано с тем фактом, что мои даты не указаны в хронологическом порядке.Я подумал, что использование команды ymd () позволит разобраться и «заставить R понять», что мои временные ряды начинаются с января 1971 года, февраля 1971 года, марта 1971 года, ..., декабря 2017 года.

Как бы я преобразовал этот фрейм данных в объект временного ряда?

Спасибо за ваш вклад.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Поскольку ваши Date получили только month и year для даты, следовательно, вы можете использовать функцию zoo::yearmon для преобразования Date в класс yearmon, что приемлемо для функции xts.

Ожидание аргумента order.by для xts объясняется в справке следующим образом:

Объект xts расширяет зоопарк класса S3 из пакета с тем же именем.

Первое различие в этом расширении предусматривает требование, чтобы значения индекса не только были уникальными и упорядоченными, но также и относились к классу на основе времени. В настоящее время допустимы следующие классы: Date, POSIXct, timeDate, а также yearmon и yearqtr, где значения индекса остаются уникальными.

AРешение может быть как:

# 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
0 голосов
/ 22 мая 2018

Это то, что вы ищете?

Сначала составьте некоторые данные.

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
...