R временной ряд, сложная последовательность - PullRequest
1 голос
/ 18 марта 2011

Я пытаюсь объединить два разных временных ряда в R со следующими характеристиками:

  1. Данные должны быть ежедневно с 08:30 до 15:00.
  2. Данные охватывают несколько недель, а не один конкретный день.
  3. В данных есть пробелы в случайных интервалах.
  4. Два набора данных не обязательно будут иметь пропуски с одинаковыми интервалами

Я хотел бы объединить два набора данных со всеми временами в последовательности с 08:30 до 15:00, и там, где был пробел в каждом, я хотел бы перенести предыдущее значение (или следующее значение).

# I have verified that the csv files are imported correctly
# The first column contains dates. and the strptime
# function can convert strings into Date/Time objects.
#
sec1_dates <- strptime(sec1[,1], "%m/%d/%Y %H:%M:%S")
sec2_dates <- strptime(sec2[,1], "%m/%d/%Y %H:%M:%S")

# The second column contains the close.
# I use the zoo function to create zoo objects from that data.
# But for some reason this ends up creating duplicates PROBLEM 1
#
a <- zoo(sec1[,2], sec1_dates)
b <- zoo(sec2[,2], sec2_dates)

# I know that I need use seq to fill in gaps but I am clueless as to how
# Once I have the proper seq I can just use na.locf to fill the appropriate values
# HOWEVER seq(start(sec1_dates), end(sec1_dates), "min") would end up returning
# every minute for each day, and I only want 08:30 to 15:30. PROBLEM 2

# The merge function can combine two zoo objects, in union
# Obviously this fails because the two index sizes don't match PROBLEM 3
#
t.zoo <- merge(a, b, all=TRUE)

Джеймс, ты был прав насчет Задачи 1. Спасибо. Я проверил, что CSV-файл дважды вытягивает данные и удаляет данные, чтобы устранить проблему. Я также использовал ваше решение для Задачи 2, но я не уверен, что это самый эффективный способ делать то, что я пытаюсь сделать. В конечном счете, я могу захотеть использовать это для запуска регрессий, и в этот момент может потребоваться какой-то цикл для извлечения любого количества наборов данных. Любая оптимизация, которую я мог бы сделать, будет принята с благодарностью.

ОБНОВЛЕННОЕ РЕШЕНИЕ

library(zoo)
library(tseries)

# Read the CSV files into data frames
sec1 <- read.csv("C:\\exportdata\\sec1.csv", stringsAsFactors=F, header=F)
sec2 <- read.csv("C:\\exportdata\\sec2.csv", stringsAsFactors=F, header=F)

# The first column contains dates.  
# I use strptime to tell it what format these appear in.
sec1_dates <- strptime(sec1[,1], "%m/%d/%Y %H:%M:%S")
sec2_dates <- strptime(sec2[,1], "%m/%d/%Y %H:%M:%S")

# The second column contains the close prices for the securities.
# I use the zoo function to create zoo objects from that data.
# Input =  a vector of data and a vector of dates.
a <- zoo(sec1[,2], sec1_dates)
b <- zoo(sec2[,2], sec2_dates)

# create a discrete time-series with the exact time frame desired
# per tip from James
template <- zoo(NULL, seq(sec1_dates[1], tail(sec1_dates, 1), "min"))
template <- template[which(strftime(time(template),"%H:%M")>"08:30" & strftime(time(template),"%H:%M")<"15:00")]

# The merge function is then used to merge
# 1) each security to the template (uses the discrete date/time range)
# 2) remove the column of data from template (used only for dates)
# 3) each security to one another (this was the ultimate goal anyway.
a.zoo <- merge(a, template, all=TRUE)
a.zoo$template <- NULL
b.zoo <- merge(b, template, all=TRUE)
b.zoo$template <- NULL
t.zoo <- merge(a.zoo, b.zoo, all=TRUE)

# Fill all NA elements with the closest non NA value.
t <- na.locf(t.zoo)

1 Ответ

1 голос
/ 18 марта 2011

ПРОБЛЕМА 1

?zoo содержит подробную информацию о том, как обращаться с дубликатами, но это, вероятно, потому, что у вас есть дубликаты в датах, созданных strptime.

ЗАДАЧА 2

Вы можете установить подмножество времени, используя [, which и time с zoo объектами, см. ?zoo, например:

t.zoo[which(strftime(time(t.zoo),"%H:%M")>"08:30" & strftime(time(t.zoo),"%H:%M")<"15:30")]

ПРОБЛЕМА 3

Используйте c для объединения: t.zoo <- c(a,b)

...