Обработка временных данных за день в R - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь проанализировать серию больших CSV-файлов, данные которых отбираются каждые 3 с или около того с помощью R. Один из столбцов - это отметка времени, записанная в ходе эксперимента, а имя файла содержит дату, когда был проведен конкретный эксперимент.

Я пытаюсь прикрепить информацию о дате к отметке времени. Естественно, для этого потребуется просто объединить информацию о дате и времени, а затем преобразовать ее в объект ymd_hms в библиотеке lubridate в R.

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

>practice[50:55, ]
   time.sub         hms hours
50 23:59:53 23H 59M 53S    23
51 23:59:55 23H 59M 55S    23
52 23:59:57 23H 59M 57S    23
53 23:59:59 23H 59M 59S    23
54    0:0:1          1S     0
55    0:0:3          3S     0

practice$hms является результатом hms(practice$time.sub), а practice$hours является результатом hours(practice$hms).

Предположим, эти данные получены на 181010. Я хочу иметь возможность автоматически назначать 181011 для отметки времени, которая выходит за пределы 23:59:59.

Вывод, который я хочу получить, будет выглядеть так:

>after_some_smart_thing()
   time.sub         hms hours   date
50 23:59:53 23H 59M 53S    23 181010
51 23:59:55 23H 59M 55S    23 181010
52 23:59:57 23H 59M 57S    23 181010
53 23:59:59 23H 59M 59S    23 181010
54    0:0:1          1S     0 181011
55    0:0:3          3S     0 181011

Лучшая идея, которую я могу придумать на данный момент, - запустить цикл for, чтобы сравнить каждый элемент hours с элементом над ним, и добавить 1 к дате, если число часов уменьшилось ....

Псевдокод этого будет:

addnumber <- 0

for (i in column length){
if (hours(i) > hours(i+1)){
    addnumber <- addnumber + 1
}
date <- date + addnumber

Должен быть лучший способ справиться с этим, и я ищу несколько советов в сжатой кодировке, чтобы сэкономить вычислительные затраты. Благодарю.

1 Ответ

0 голосов
/ 01 ноября 2018

Вот короткий путь с использованием dplyr::lag

library(dplyr)
df %>% mutate(A=hours-lag(hours), B=if_else(is.na(A) | A!=-23,0,1), date=181010+cumsum(B==1))
  #%>% select(-A,-B) #If you don't need them

  time.sub         hms hours   A B   date
1 23:59:53 23H 59M 53S    23  NA 0 181010
2 23:59:55 23H 59M 55S    23   0 0 181010
3 23:59:57 23H 59M 57S    23   0 0 181010
4 23:59:59 23H 59M 59S    23   0 0 181010
5    0:0:1          1S     0 -23 1 181011
6    0:0:3          3S     0   0 0 181011
...