2017-01-07 2 views
1

У меня есть следующие data.frame, что я хотел бы тайному в xts() объекта, но ломает голову, пытаясь понять, как форматировать раз:Как конвертировать нерегулярные раз в объект XTS с помощью R

data.frame

Данные упорядочены по последним (сверху) и самым старым (внизу). Проблема в том, что каждая строка не соответствует формату, поэтому у меня возникли проблемы с ее форматированием так, чтобы каждая строка отображала правильную дату & времени.

Желаемая выход для даты/времени Колонка:

01/05/17 02:55 PM 
01/05/17 11:40 AM 
01/05/17 07:00 AM 
12/30/16 05:50 PM 
12/29/16 07:03 AM 
12/30/16 07:00 AM 

ДАННЫЕ:

data <- structure(list(Date = c("Jan-05-17 02:55PM", "11:40AM", "07:00AM", 
"Dec-30-16 05:50PM", "Dec-29-16 07:03AM", "07:00AM"), News = c("ENTEROMEDICS INC Files SEC form 8-K, Other Events, Financial Statements and Exhibits +89.95%", 
"Why These 5 Biopharma Stocks Are Making Massive Gains on Thursday", 
"EnteroMedics Announces vBloc® Neurometabolic Therapy Now Available at MedStar Health and Roper St. Francis PR Newswire", 
"Why U.S. Steel, EnteroMedics, and McEwen Mining Slumped Today at Motley Fool -18.03%", 
"Splits Calendar: EnteroMedics splits before market open today (70:1 ratio)", 
"EnteroMedics Announces Retirement of All Senior Convertible Notes PR Newswire" 
), Symbol = c("ETRM", "ETRM", "ETRM", "ETRM", "ETRM", "ETRM")), .Names = c("Date", 
"News", "Symbol"), row.names = c(NA, 6L), class = "data.frame") 

ответ

2

Используйте sub, чтобы заменить цифру в начале Date на NA с последующим пробелом, за которым следует цифра. Из этого следует использовать read.table для создания кадра данных из двух столбцов с датой (или NA) в столбце 1 и времени в столбце 2. Заполните значения NA, используя na.locf, давая DF2. Теперь cbindDF2 и data[-1] чтение data.frame, созданное с использованием read.zoo. Окончательно преобразуйте полученный объект "zoo" в "xts".

DF2 <- na.locf(read.table(text = sub("^(\\d)", "NA \\1", data$Date))) 
z <- read.zoo(cbind(DF2, data[-1]), index = 1:2, tz = "", format = "%b-%d-%y %I:%M%p") 
as.xts(z) 
2

Если у вас есть опечатка в последней строке нужного вывода даты и времени, которое я предполагаю, вы имеете в виду 12/29/16 07:00 AM, тогда, когда у вас есть элемент в столбце Date, который не имеет даты, возьмите самую последнюю известную дату и рулон «назад»:

library(stringr) 

l_datetime <- str_split(data$Date, " ") 
data$ymd <- unlist(lapply(l_datetime, function(x) ifelse(length(x) == 2, x[[1]], NA))) 
data$time <- unlist(lapply(l_datetime, function(x) ifelse(length(x) == 2, x[[2]], x[[1]]))) 
# Roll "backward" the latest known date for elements of column `Date` that have missing YYYY-MM-DD values 
data$ymd <- na.locf(data$ymd) 
# Carefully parse the time strings allowing for AM/PM: 
psx_date <- as.POSIXct(paste(data$ymd, data$time), format = "%b-%d-%y %I:%M%p") 

x_data <- xts(x = data[, c("News", "Symbol")], order.by = psx_date) 
# > x_data 
#                           News         Symbol 
# 2016-12-29 07:00:00 "EnteroMedics Announces Retirement of All Senior Convertible Notes PR Newswire"           "ETRM" 
# 2016-12-29 07:03:00 "Splits Calendar: EnteroMedics splits before market open today (70:1 ratio)"            "ETRM" 
# 2016-12-30 17:50:00 "Why U.S. Steel, EnteroMedics, and McEwen Mining Slumped Today at Motley Fool -18.03%"         "ETRM" 
# 2017-01-05 07:00:00 "EnteroMedics Announces vBloc® Neurometabolic Therapy Now Available at MedStar Health and Roper St. Francis PR Newswire" "ETRM" 
# 2017-01-05 11:40:00 "Why These 5 Biopharma Stocks Are Making Massive Gains on Thursday"              "ETRM" 
# 2017-01-05 14:55:00 "ENTEROMEDICS INC Files SEC form 8-K, Other Events, Financial Statements and Exhibits +89.95%"       "ETRM" 
1

Вот решение, используя tidyquant пакет, который загружает все пакеты, необходимые для решения этой проблемы. То же, как и другие решения, вы должны иметь согласованную дату с структуры, такие как:

"Jan-05-17 02:55 PM" 

Используя lubridate пакет, вы можете преобразовать в POSIXct класса с функцией mdy_hm() следующим образом:

"Jan-05-17 02:55 PM" %>% lubridate::mdy_hm() 
> "2017-01-05 14:55:00 UTC" 

Где функция lubridate::mdy_hm() обозначает месяц-день-годовой час. Выходной сигнал - это дата в правильном классе date-time.

tidyquant пакет имеет удобную функцию, as_xts(), с аргументом, date_col, что, когда указанный преобразует data.frame столбец даты для XTS имен строк. Я использую трубу (%>%), чтобы сделать код более читаемым и показать рабочий процесс, и функцию dplyr::mutate(), которая меняет столбец на класс POSIXct с использованием функции lubridate::mdy_hm(). Окончательный рабочий процесс выглядит следующим образом:

data %>% 
    mutate(Date = lubridate::mdy_hm(Date)) %>% 
    as_xts(date_col = Date) 

Убедитесь, что столбец Дата имеет все строки с действительным формате, например «Jan-05-17 02:55 PM», прежде чем пытаться фрагмент кода, в противном случае вы получите ошибка синтаксического анализа в функции lubridate::mdy_hm().

данных я использовал для теста ниже:

data <- structure(list(Date = c("Jan-05-17 02:55 PM", "Jan-05-17 11:40 AM", "Jan-05-17 07:00 AM", 
          "Dec-30-16 05:50 PM", "Dec-29-16 07:03 AM", "Dec-29-16 07:00 AM"), News = c("ENTEROMEDICS INC Files SEC form 8-K, Other Events, Financial Statements and Exhibits +89.95%", 
                          "Why These 5 Biopharma Stocks Are Making Massive Gains on Thursday", 
                          "EnteroMedics Announces vBloc® Neurometabolic Therapy Now Available at MedStar Health and Roper St. Francis PR Newswire", 
                          "Why U.S. Steel, EnteroMedics, and McEwen Mining Slumped Today at Motley Fool -18.03%", 
                          "Splits Calendar: EnteroMedics splits before market open today (70:1 ratio)", 
                          "EnteroMedics Announces Retirement of All Senior Convertible Notes PR Newswire" 
          ), Symbol = c("ETRM", "ETRM", "ETRM", "ETRM", "ETRM", "ETRM")), .Names = c("Date", 
                             "News", "Symbol"), row.names = c(NA, 6L), class = "data.frame") 

 Смежные вопросы

  • Нет связанных вопросов^_^