2016-07-06 8 views
0

Я вводил следующий файл данных: три пары данных с датой (плюс индексный индекс numb). Проблема в том, что каждая цена имеет разные национальные праздники, поэтому цены в Великобритании и США в конечном итоге смещаются. Есть ли хороший способ нажать дату в формате xts/zoo и заполнить NA, где цена не существует (mkt закрыт)?Файл данных смешанных дат

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 

т.д.

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

Я попытался с помощью {A <- strptime(UK2y$Date1, format = "%d/%m/%Y")}, но это приводит к недопустимому объекту зоопарка. Я в конечном итоге с правильными отформатированных датами в «A» как POSIX класса, который не смог cbind с зоопарком («ошибка в структуре»):

UK2y <- cbind(UK2y, A) 

Вы видите выше там дополнительной эмиссии в том, что каждый из парных столбца отличается длина. Некоторая функция «совпадения даты» уменьшила бы, или, возможно, в зоопарке/xts есть soln?

ответ

2

Вот решение с использованием 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

Вы можете создать пустой фрейм данных с правильными датами сгенерированных в порядке, вы хотите, а затем объединить:

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

Данные экспортируются из Bloomberg - это формат даты. Этот soln отлично работает, если даты правильно указаны в R, но в настоящее время это сортировка дат в числовом порядке «1/1/xx» относительно хроно. – rrg

+0

Ответа на этот вопрос отредактировал для обойти вашу проблему. – bVa