Программирование на R: создание часовых интервалов времени в массиве с помощью цикла for

У меня есть простой цикл for, который не возвращает то, что мне нужно:

    time_bin[1] <- conversion_frame$time[1]

    for (t in 1:23)
        time_bin[t+1] <- as.POSIXct(time_bin[t]) +3600

В консоли я получаю это возвращение

     time_bin[1]
     [1] "2015-07-23 00:00:01"

И уравнение также возвращает время

as.POSIXct(time_bucketsClient[1]) +3600
[1] "2015-07-23 01:00:01 EDT"

Тем не менее, если я вставлю элемент массива, он вернет это

time_bucketsClient[1+1] <- as.POSIXct(time_bucketsClient[1]) +3600
time_bucketsClient[2]
[1] "1437627601"

весь массив имеет это число как константу после time_bin[1], которую я установил из значения фрейма данных

Почему оно это делает? Как я могу получить дату и час, возвращаемые в каждом элементе массива, каждый раз увеличивая на час? Я попытался преобразовать в asPOSIX.ct и использовать asDate, но это не дает мне правильного значения.

Спасибо.


person FriendOfDolphins    schedule 24.07.2015    source источник


Ответы (1)


Вам не нужен цикл для генерации временной последовательности, просто используйте метод seq для объектов класса POSIXt. Например, используя дату начала:

tt <- as.POSIXct("2015-07-23 00:00:01")

24-часовая последовательность от даты начала может быть получена с использованием метода seq.

tts <- seq(tt, by = "hours", length = 24)

> head(tts)
[1] "2015-07-23 00:00:01 CST" "2015-07-23 01:00:01 CST"
[3] "2015-07-23 02:00:01 CST" "2015-07-23 03:00:01 CST"
[5] "2015-07-23 04:00:01 CST" "2015-07-23 05:00:01 CST"

Затем вам нужно будет преобразовать последовательность дат и времени в векторы дат и часов. Например, вызов as.Date() для tts дает нам объект класса Date, состоящий только из дат.

head(as.Date(tts))

> head(as.Date(tts))
[1] "2015-07-23" "2015-07-23" "2015-07-23" "2015-07-23" "2015-07-23"
[6] "2015-07-23"

тогда как комбинация as.numeric() и format() дает нам час

as.numeric(format(tts, format = "%H"))

> as.numeric(format(tts, format = "%H"))
 [1]  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Объединить эти шаги так же просто, как

df <- data.frame(Times = tts)
df <- transform(df,
                Date = as.Date(Times),
                Hour = as.numeric(format(Times, format = "%H")))

который дает

> head(df)
                Times       Date Hour
1 2015-07-23 00:00:01 2015-07-23    0
2 2015-07-23 01:00:01 2015-07-23    1
3 2015-07-23 02:00:01 2015-07-23    2
4 2015-07-23 03:00:01 2015-07-23    3
5 2015-07-23 04:00:01 2015-07-23    4
6 2015-07-23 05:00:01 2015-07-23    5
person Gavin Simpson    schedule 24.07.2015