2011-03-18 8 views
1

Je tente de fusionner deux séries chronologiques différentes en R avec les caractéristiques suivantes:R séries temporelles, la séquence compliquée

  1. Les données doivent être 8 heures 30-15h00 sur une base quotidienne.
  2. Les données s'étendent sur plusieurs semaines, pas seulement un jour particulier.
  3. Il existe des espaces dans les données à des intervalles aléatoires.
  4. Les deux ensembles de données ne seront pas avoir des lacunes dans les mêmes intervalles nécessairement

Je voudrais fusionner les deux ensembles de données, avec tout le temps dans la séquence 8 heures 30-15h00 et où il y avait un écart dans chacun, j'aimerais que la valeur précédente (ou la valeur suivante) soit reportée.

# 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) 

James vous aviez raison problème 1. Je vous remercie. J'ai vérifié que le fichier csv tirait les données deux fois et que la suppression des données corrigeait le problème. J'ai également utilisé votre solution pour le problème 2, mais je ne suis pas certain que ce soit la manière la plus efficace de faire ce que j'essaie de faire. En fin de compte, je pourrais vouloir utiliser ceci pour exécuter des régressions, et à ce moment-là, il faudrait peut-être une boucle quelconque pour extraire n'importe quel nombre de jeux de données. Toute optimisation que je pourrais faire serait grandement appréciée.

SOLUTION MISE À JOUR

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 Veuillez clarifier le problème en fournissant des exemples de données. Utilisez 'dput' pour le faire. Montrez ce que vous obtenez et en quoi cela diffère de ce que vous voulez. Le "évidemment ça échoue" n'est pas évident du tout. 'merge.zoo' ne nécessite pas d'index correspondants. –

Répondre

1

PROBLÈME 1

?zoo contient des détails sur la façon de traiter les doublons, mais c'est probablement parce que vous avez des doublons dans vos dates créées par strptime .

PROBLÈME 2

Vous pouvez sous-ensemble fois en utilisant [, which et time avec zoo objets, voir ?zoo, par exemple:

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

PROBLÈME 3

Utilisez c combiner : t.zoo <- c(a,b)

+0

James, merci beaucoup pour votre aide! J'ai utilisé votre solution aux problèmes 1 et 2, et je suis assez certain que l'utilisation de c pour combiner à la place de la fusion finale améliorerait la vitesse avec laquelle mon code traitera. Y a-t-il des modifications supplémentaires que vous suggéreriez? (note: j'ai mis à jour le code ci-dessus) – saneshark

Questions connexes