R: Вычисление среднемесячных значений из почасовых данных, а затем построение графика - PullRequest
1 голос
/ 23 ноября 2011

После преобразования символьной строки даты / времени в POSIXlt с использованием strptime у меня осталось следующее (данные для удобства здесь усечены):

         DateTime  North  South   West   East  Seast  System

1 2008-09-12 01:00:00 1919,9 3721,4 2085,9 2565,5 2571,1 12863,8

2 2008-09-12 02:00:00 1827,0 3518,1 1965,3 2396,9 2410,7 12118,0

3 2008-09-12 03:00:00 1755,43388,4 1866,8 2338,7 2335,2 11684,5

4 2008-09-12 04:00:00 1733,5 3327,1 1810,0 2295,6 2290,2 11456,4

5 2008-09-12 05:00:00 1742,7 3327,3 1831,4 2314,2 2302,311517,9

6 2008-09-12 06:00:00 1912,2 3504,4 1986,7 2515,0 2502,6 12420,9

Затем я агрегировал данные (на первый взгляд, верно) в среднегодовые значения, используяследующий фрагмент кода: North_Monthly_Avg <- aggregate(North, list(Date=format(DateTime, "%Y-%m")),mean), который дает следующее:

 Date        x

1 2008-09 2192.066

2 2008-10 1885.074

3 2008-11 1675,373

4 2008-12 1637.231

5 2009-01 1752.693

6 2009-02 1743.393

Я могу построить значения 'x', но не могу правильно обозначить года-месяца на оси x, поскольку он только строит индекс.Не уверен, что мне не хватает ... Я играл с осью.POSIXct, но не повезло.

Ответы [ 6 ]

3 голосов
/ 23 ноября 2011

Попробуйте zoo и lattice:

library(zoo)
library(lattice)

dat <- 'Date  Time  North  South   West   East  Seast  System
2008-09-12 01:00:00 1919.9 3721.4 2085.9 2565.5 2571.1 12863.8
2008-09-12 02:00:00 1827.0 3518.1 1965.3 2396.9 2410.7 12118.0
2008-09-12 03:00:00 1755.4 3388.4 1866.8 2338.7 2335.2 11684.5
2008-09-12 04:00:00 1733.5 3327.1 1810.0 2295.6 2290.2 11456.4
2008-09-12 05:00:00 1742.7 3327.3 1831.4 2314.2 2302.3 11517.9
2008-09-12 06:00:00 1912.2 3504.4 1986.7 2515.0 2502.6 12420.9'

z <- read.zoo(text = dat,  header = TRUE,  index.column = 1:2, tz = "")
xyplot(z)

zAgg <- aggregate(z$North,  by = as.yearmon,  FUN = mean)

dat2 <- 'Date        x
2008-09 2192.066
2008-10 1885.074
2008-11 1675.373
2008-12 1637.231
2009-01 1752.693
2009-02 1743.393'

zAgg <- read.zoo(text = dat2, header = TRUE,  FUN = as.yearmon)

plot(zAgg, xaxt = "n")

tt <- time(zAgg)
m <- format(tt, "%m")
axis(side = 1, at = tt, labels = ifelse(m == "01", trunc(tt), m), cex.axis = .7)
0 голосов
/ 20 июня 2016

Вы можете попробовать пакет openair и использовать его функцию timeAverage

Ежечасно в месяц

library(openair)  
mydata$date <- as.POSIXct(strptime(mydata$date, format = "%d/%m/%Y %H:%M", tz = "GMT"))
hourly<-timeAverage(mydata, average.time = "day")
0 голосов
/ 10 сентября 2015

Проблема в том, что вы используете format для создания группировок, которые будут использоваться для подразделения.Это превращает значения в строки, так что функции построения графиков не знают, что они должны отображаться как даты.

Функция cut имеет вариант cut.POSIXlt, который будет делать именно то, что вам нужно, и сохранять типинформация, так что все графические объекты будут просто работать.

Вместо

North_Monthly_Avg <- aggregate(North, list(Date=format(DateTime, "%Y-%m")),mean) 

Просто используйте

North_Monthly_Avg <- aggregate(North, cut(DateTime, "month"), mean) 
0 голосов
/ 27 ноября 2011

Я думаю, что проблема в том, что нет даты. Вам придется рассчитаться с 1-го числа месяца или 15-го числа месяца и применить это к вашей агрегированной таблице.

Я придумал это:

North_Monthly_Avg=aggregate(North,by=list(format(DateTime,'%Y-%m')),mean)
names(North_Monthly_Avg)=c('Month','North')
North_Monthly_Avg$day=15
North_Monthly_Avg$Date=paste(North_Monthly_Avg$Month,North_Monthly_Avg$day,sep='-')
North_Monthly_Avg$Date=strptime(North_Monthly_Avg$Date,'%Y-%m-%d')
plot(m$Date,m$North,xaxt='n') # the xaxt='n' removes any ticks on the x axis
axis(1,as.numeric(m$Date),labels=format(m$Date,'%Y-%m')) # formats the x axis to your liking

Я довольно плохо знаком с R, так что, возможно, это не самое элегантное решение, но оно будет работать.

Замените 15 на 1 в строке $day, если вы предпочитаете 1-е число месяца, а sep в paste следует изменить на '-0'.

0 голосов
/ 25 ноября 2011

@ user1062431, Чтобы отредактировать имена тиков в предпочитаемом формате, отредактируйте строку m <- format (tt, "% m") в ответе Оскара. </p>

Чтобы получить формат 12 - 2008, вам нужно изменить:

m <- формат (tt, "% m") в m <- формат (tt, "% m -% Y") </p>

Чтобы получить формат дек 2008, вам нужно изменить:

m <- формат (tt, "% m") в m <- формат (tt, "% b% Y") </p>

0 голосов
/ 23 ноября 2011

Попробуйте использовать as.integer () на дату

North_Monthly_Avg <- aggregate(North, list(Date=as.integer(format(DateTime, "%Y-%m"))),mean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...