2016-04-17 3 views
1

У меня есть CSV-файл, который содержит следующее:Dataframe значение даты и времени строки заполнения

ts1<-read.table(header = TRUE, sep=",", text=" 
    start,   end,   value 
1,26/11/2014 13:00,26/11/2014 20:00,decreasing 
2,26/11/2014 20:00,27/11/2014 09:00,increasing ") 

Я хотел бы передать выше dataframe к dataframe, в котором открыт каждая строка time колонка и заполняется со значением , Промежуток времени заполняется от start времени к end времени - 1 (минус 1), как следует:

 date  hour  value 
1 26/11/2014 13:00 decreasing 
2 26/11/2014 14:00 decreasing 
3 26/11/2014 15:00 decreasing 
4 26/11/2014 16:00 decreasing 
5 26/11/2014 17:00 decreasing 
6 26/11/2014 18:00 decreasing 
7 26/11/2014 19:00 decreasing 
8 26/11/2014 20:00 increasing 
9 26/11/2014 21:00 increasing 
10 26/11/2014 22:00 increasing 
11 26/11/2014 23:00 increasing 
12 26/11/2014 00:00 increasing 
13 26/11/2014 01:00 increasing 
14 26/11/2014 02:00 increasing 
15 26/11/2014 03:00 increasing 
16 26/11/2014 04:00 increasing 
17 26/11/2014 05:00 increasing 
18 26/11/2014 06:00 increasing 
19 26/11/2014 07:00 increasing 
20 26/11/2014 08:00 increasing 

Я попытался начать с разделения часов от даты:

> t <- strftime(ts1$end, format="%H:%M:%S") 
> t 
[1] "00:00:00" "00:00:00" 

ответ

1

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(ts1)), сгруппированные по последовательности строк (1:nrow(ts1)), мы преобразуем столбцы «start» и «end» в класс datetime (используя dmy_hm от lubridate), получите последовательность by '1 час', format результат в ожидаемом формате, затем разделить по пробелу (tstrsplit), объединить столбец «значение», удалить столбец «rn», назначив NULL. Наконец, мы можем изменить имена столбцов (при необходимости).

library(lubridate) 
library(data.table) 
res <- setDT(ts1)[,{st <- dmy_hm(start) 
        et <- dmy_hm(end) 
        c(tstrsplit(format(head(seq(st, et, by = "1 hour"),-1), 
          "%d/%m/%Y %H:%M"), "\\s+"), as.character(value))} , 
     by = .(rn=1:nrow(ts1)) 
    ][, rn := NULL][] 
setnames(res, c("date", "hour", "value"))[] 
#   date hour  value 
# 1: 26/11/2014 13:00 decreasing 
# 2: 26/11/2014 14:00 decreasing 
# 3: 26/11/2014 15:00 decreasing 
# 4: 26/11/2014 16:00 decreasing 
# 5: 26/11/2014 17:00 decreasing 
# 6: 26/11/2014 18:00 decreasing 
# 7: 26/11/2014 19:00 decreasing 
# 8: 26/11/2014 20:00 increasing 
# 9: 26/11/2014 21:00 increasing 
#10: 26/11/2014 22:00 increasing 
#11: 26/11/2014 23:00 increasing 
#12: 27/11/2014 00:00 increasing 
#13: 27/11/2014 01:00 increasing 
#14: 27/11/2014 02:00 increasing 
#15: 27/11/2014 03:00 increasing 
#16: 27/11/2014 04:00 increasing 
#17: 27/11/2014 05:00 increasing 
#18: 27/11/2014 06:00 increasing 
#19: 27/11/2014 07:00 increasing 
#20: 27/11/2014 08:00 increasing 
1

Вот решение, использующее lubridate и plyr. Он обрабатывает каждую строку данных, чтобы сделать последовательность от начала до конца, и возвращает ее со значением. Результаты из каждой строки объединяются в один файл данных. Если вам необходимо обработать результаты дальше, вам может быть лучше не отделять дату и время на дату и время

library(plyr) 
library(lubridate) 
ts1$start <- dmy_hm(ts1$start) 
ts1$end <- dmy_hm(ts1$end) 

adply(.data = ts1, .margin = 1, .fun = function(x){ 
    datetime <- seq(x$start, x$end, by = "hour") 
    #data.frame(datetime, value = x$value)" 
    data.frame(date = as.Date(datetime), time = format(datetime, "%H:%M"), value = x$value) 
})[, -(1:2)] 
Смежные вопросы