2016-07-06 18 views
0

Ich gebe die folgende Datendatei ein: drei Paare von Datum-Preis-Daten (plus Spaltenindex numb). Das Problem ist, dass jeder Preis verschiedene nationale Feiertage hat, so dass die Preise in Großbritannien und in den USA letztendlich falsch liegen. Gibt es eine schöne Möglichkeit, das Datum in ein xts/zoo-Format zu schieben und mit NA zu füllen, wo der Preis nicht existiert (mkt ist geschlossen)?Mischdatum Datendatei

ColNumb Date1  UK2Y  Date2   US2Y  Date3  GBPUSD 
1  09/07/2012 0.9330 09/07/2012 0.5210 09/07/2012 1.552554 
2 10/07/2012 0.9401 10/07/2012 0.5235 10/07/2012 1.551831 
3 11/07/2012 0.9122 11/07/2012 0.5003 11/07/2012 1.550388 
4 12/07/2012 0.8732 12/07/2012 0.4805 12/07/2012 1.542972 

etc

UK2y <- as.xts(data[1:1033,1:2]) 
US2y <- as.xts(data[,3:4]) 
GBPUSD <- data[,5:6] 

Ich habe versucht, {A <- strptime(UK2y$Date1, format = "%d/%m/%Y")} verwenden, aber dies führt zu ungültigen Zoo-Objekt. Ich schließe mit richtig formatierten Daten in ‚A‘ wie POSIX-Klasse auf, die mit Zoo cbind fehlschlägt („Fehlern in der Struktur“):

UK2y <- cbind(UK2y, A) 

Sie sehen dort oben in einem zusätzlichen Problem, dass jedes Paar Spalt unterschiedliche Länge. Eine Art "date match" -Funktion würde mildern oder vielleicht gibt es eine Lösung in zoo/xts?

Antwort

2

Hier Lösung wird mit merge:

# subset your data 
UK2Y = data[,c("Date1", "UK2Y")] 
US2Y = data[,c("Date2", "US2Y")] 
GBPUSD = data[,c("Date3", "GBPUSD")] 

# rename them to have the same Date column 
names(UK2Y)[names(UK2Y) == "Date1"] <- "Date" 
names(US2Y)[names(US2Y) == "Date2"] <- "Date" 
names(GBPUSD)[names(GBPUSD) == "Date3"] <- "Date" 

# Test: remove one data 
US2Y = US2Y[-4,] # market closed in US this day 

# Merge the data frames 
group = merge(UK2Y, US2Y, by = "Date", all = T) # "all = T" will show missing data as NA 
group = merge(group, GBPUSD, by = "Date", all = T) 

print(group) 

    Date UK2Y US2Y GBPUSD 
1 2012-07-09 0.9330 0.5210 1.552554 
2 2012-07-10 0.9401 0.5235 1.551831 
3 2012-07-11 0.9122 0.5003 1.550388 
4 2012-07-12 0.8732  NA 1.542972 

EDIT

Sie können einen leeren Datenrahmen mit den richtigen Daten in der gewünschten Reihenfolge, und dann verschmelzen generiert erstellen:

UK2Y$Date = as.Date(UK2Y$Date) 
US2Y$Date = as.Date(US2Y$Date) 
GBPUSD$Date = as.Date(GBPUSD$Date) 

# create empty dataframe with correct dates 
dates = data.frame(Date = seq(as.Date("2012-07-01"), as.Date("2012-07-20"), by = '1 day')) 

US2Y = US2Y[-4,] 

group = merge(dates, UK2Y, by = "Date", all = T) 
group = merge(group, US2Y, by = "Date", all = T) 
group = merge(group, GBPUSD, by = "Date", all = T) 

print(group) 
    Date UK2Y US2Y GBPUSD 
1 2012-07-01  NA  NA  NA 
2 2012-07-02  NA  NA  NA 
3 2012-07-03  NA  NA  NA 
4 2012-07-04  NA  NA  NA 
5 2012-07-05  NA  NA  NA 
6 2012-07-06  NA  NA  NA 
7 2012-07-07  NA  NA  NA 
8 2012-07-08  NA  NA  NA 
9 2012-07-09 0.9330 0.5210 1.552554 
10 2012-07-10 0.9401 0.5235 1.551831 
11 2012-07-11 0.9122 0.5003 1.550388 
12 2012-07-12 0.8732  NA 1.542972 
13 2012-07-13  NA  NA  NA 
14 2012-07-14  NA  NA  NA 
15 2012-07-15  NA  NA  NA 
16 2012-07-16  NA  NA  NA 
17 2012-07-17  NA  NA  NA 
18 2012-07-18  NA  NA  NA 
19 2012-07-19  NA  NA  NA 
20 2012-07-20  NA  NA  NA 
+0

Die Daten werden von Bloomberg exportiert ist dieses Datumsformat. Diese Lösung funktioniert gut, wenn Datumsangaben korrekt in R angegeben sind, aber derzeit Daten in einer numerischen "1/1/xx" - Reihenfolge sortiert werden. – rrg

+0

Antwort bearbeitet, um Ihr Problem zu umgehen. – bVa