Вопрос по time-series, r – преобразовать почасовые данные об осадках в ежедневные данные за определенный промежуток времени

4

У меня есть почасовые данные о количестве осадков и температуре в течение длительного периода. Я хотел бы получить ежедневные значения из почасовых данных. Я рассматриваю дневные средства с 07:00:00 до следующего дня 07:00:00.

Не могли бы вы сказать мне, как преобразовать почасовые данные в ежедневные между определенным интервалом времени?

пример :07:00:00 to 07:00:00 или же12:00:00 to 12:00:00)

Данные об осадках выглядят так:

1970-01-05 00:00:00      1.0 
1970-01-05 01:00:00      1.0
1970-01-05 02:00:00      1.0
1970-01-05 03:00:00      1.0
1970-01-05 04:00:00      1.0
1970-01-05 05:00:00      3.6
1970-01-05 06:00:00      3.6
1970-01-05 07:00:00      2.2
1970-01-05 08:00:00      2.2
1970-01-05 09:00:00      2.2
1970-01-05 10:00:00      2.2
1970-01-05 11:00:00      2.2
1970-01-05 12:00:00      2.2
1970-01-05 13:00:00      2.2
1970-01-05 14:00:00      2.2
1970-01-05 15:00:00      2.2
1970-01-05 16:00:00      0.0
1970-01-05 17:00:00      0.0
1970-01-05 18:00:00      0.0
1970-01-05 19:00:00      0.0
1970-01-05 20:00:00      0.0
1970-01-05 21:00:00      0.0
1970-01-05 22:00:00      0.0
1970-01-05 23:00:00      0.0
1970-01-06 00:00:00      0.0
Она представляет дату и время 1970-01-05 05:00:00 ("% Y-% m-% d% H:% M:% S") и 3,6 осадков (мм) user1537175
Пожалуйста, объясните, что означает эта строка 1970-01-05 05:00:00 3.6 HatSoft

Ваш Ответ

4   ответа
1

Шаг 1: преобразовать дату в POSIXct

ttt <- as.POSIXct("1970-01-05 08:00:00",tz="GMT")
ttt
#"1970-01-05 08:00:00 GMT"

Шаг 2: вычитаем разницу в 7 часов

ttt <- ttt-as.difftime(7,units="hours")
ttt
#"1970-01-05 01:00:00 GMT"

Шаг 3: усечение до дней

ttt<-trunc(ttt,"days")
ttt
#"1970-01-05 GMT"

Шаг 4: используйте plyr, data.table или любой другой метод для расчета ежедневных средних

как вычесть время из 7 часов из кода user1537175
4

Сначала создайте воспроизводимые данные, чтобы мы могли помочь вам лучше:

require(xts)
set.seed(1)
X = data.frame(When = as.Date(seq(from = ISOdatetime(2012, 01, 01, 00, 00, 00),
                                  length.out = 100, by="1 hour")),
               Measurements = sample(1:20, 100, replace=TRUE))

Теперь у нас есть фрейм данных со 100 почасовыми наблюдениями, где даты начинаются с2012-01-01 00:00:00 и заканчивается в2012-01-05 03:00:00 (время в 24-часовом формате).

Во-вторых, преобразовать его в объект XTS.

X2 = xts(X$Measurements, order.by=X$When)

В-третьих, узнайте, как установить временное окно.

X2['T04:00/T08:00']
#                     [,1]
# 2012-01-01 04:00:00    5
# 2012-01-01 05:00:00   18
# 2012-01-01 06:00:00   19
# 2012-01-01 07:00:00   14
# 2012-01-01 08:00:00   13
# 2012-01-02 04:00:00   18
# 2012-01-02 05:00:00    7
# 2012-01-02 06:00:00   10
# 2012-01-02 07:00:00   12
# 2012-01-02 08:00:00   10
# 2012-01-03 04:00:00    9
# 2012-01-03 05:00:00    5
# 2012-01-03 06:00:00    2
# 2012-01-03 07:00:00    2
# 2012-01-03 08:00:00    7
# 2012-01-04 04:00:00   18
# 2012-01-04 05:00:00    8
# 2012-01-04 06:00:00   16
# 2012-01-04 07:00:00   20
# 2012-01-04 08:00:00    9

В-четвертых, используйте эту информацию сapply.daily и любую функцию, которую вы хотите, следующим образом:

apply.daily(X2['T04:00/T08:00'], mean)
#                     [,1]
# 2012-01-01 08:00:00 13.8
# 2012-01-02 08:00:00 11.4
# 2012-01-03 08:00:00  5.0
# 2012-01-04 08:00:00 14.2

Update: Custom endpoints

Перечитав ваш вопрос, я вижу, что неправильно истолковал то, что вы хотели.

Кажется, вы хотите принять среднее значение 24-часового периода, не обязательно с полуночи до полуночи.

Для этого вам следует броситьapply.daily и вместо этого используйтеperiod.apply с обычаемendpointс, как это:

# You want to start at 7AM. Find out which record is the first one at 7AM.
A = which(as.character(index(X2)) == "2012-01-01 07:00:00")

# Use that to create your endpoints. 
# The ends of the endpoints should start at 0 
# and end at the max number of records.
ep = c(0, seq(A, 100, by=24), 100)
period.apply(X2, INDEX=ep, FUN=function(x) mean(x))
#                         [,1]
# 2012-01-01 07:00:00 12.62500
# 2012-01-02 07:00:00 10.08333
# 2012-01-03 07:00:00 10.79167
# 2012-01-04 07:00:00 11.54167
# 2012-01-05 03:00:00 10.25000
+1 за хорошийxts демонстрация
@ Андри, спасибо, но, похоже, я неправильно понял вопрос ОП. Они хотят агрегировать, начиная с первого дня и заканчивая последующим днем, поэтому, в основном, смещая начало и конецapply.daily, Сообщение сейчас обновлено.
2

Вы можете вам этот код:

fun <- function(s,i,j) { sum(s[i:(i+j-1)]) }
sapply(X=seq(1,24*nb_of_days,24),FUN=fun,s=your_time_serie,j=24)

Вам просто нужно изменить 1 на другое значение, чтобы иметь другой интервал времени: 8 из07:00:00 to 07:00:00 или 13 для12:00:00 to 12:00:00

Добро пожаловать;)
Спасибо, я постараюсь user1537175
Большое спасибо, это хорошо работает user1537175
0

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

Похожие вопросы