Формат даты для построения отметок по оси x данных временного ряда

Дата в файлах данных имеет формат, т. Е. 1975M1, 1975M2, ... 2011M12 для данных временных рядов. при построении этих данных с использованием R я хочу, чтобы ось х отображала месяцы на оси тиков.

Чтобы даты были прочитаны правильно, я попытался заменить M на -, чтобы получить формат% Y-% m, но это не очень хорошо для drawTimeAxis из пакета hydroTSM, который, возможно, требует формат% Y-% M-% d. Это дает ошибку, что неверное число измерений для измерения тиков.

Другой метод разбора и форматирования данных, как вx$newdate <- strptime(as.character(x$date), "%Y-%m") а потомformat(x$newdate,""%Y-%m") также не читает дату и выдает ошибку ... все нет.

date <- as.Date (data [, 1] ошибка, что символьная строка не имеет стандартного однозначного формата и ts <- read.zoo (xts, as.yearmon (x [, 1])) дает плохие записи в данных строк.

Пожалуйста, дайте решение о том, как эти данные можно прочитать с информацией о дате.

Небольшое подмножество файла данных

date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33

Обновление: ответы до сих пор решают проблему правильного чтения даты, используя% YM% m в пакете xts или добавляя день для получения стандартного формата. Настройка оси тика все еще остается проблемой. DrawTimeAxis дает ошибку измерения, а команды графика не отображают ежемесячные метки для данных более одного года или иным образом. Любые методы настройки оси тиков?

 Anusha27 окт. 2012 г., 11:29
Нашел следующий метод на SO для разметки галочекссылка.
 A5C1D2H2I1M1N2O1R2T127 окт. 2012 г., 12:13
информация в этой ссылке действительно не сильно отличается от деталей в моем ответе.

Ответы на вопрос(2)

Решение Вопроса

Возможно, вы не используетеas.yearmon() правильно, потому что у меня работает следующее (используяdat из ответа Гэвина)

library(zoo)
dat$date <- as.yearmon(dat$date, "%YM%m")

Таким образом, вы получаете правильные графики:

Ваши данные:

dat <- read.table(text = "date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33", header = TRUE)

Преобразование вxts с помощьюas.yearmon() из пакета "зоопарк".

library(xts) # Will also load zoo
dat.xts <- xts(dat[-1], 
               order.by = as.yearmon(dat$date, "%YM%m"))
dat.xts
#               x     x2
# Jan 1975 112.44 113.12
# Feb 1975 113.10 114.36
# Mar 1975 115.04 114.81
# Apr 1975 117.65 115.35
# May 1975 119.50 116.92
# Jun 1975 121.40 118.56
# Jul 1975 120.64 118.97
# Aug 1975 119.12 119.84
# Sep 1975 118.91 120.59
# Oct 1975 120.58 122.30
# Nov 1975 121.26 123.35
# Dec 1975 122.34 123.33

Построение ваших данных:

plot.zoo(dat.xts)

plot.zoo(dat.xts, 
         plot.type="single", 
         col = c("red", "blue"))

Обновление: указание ваших собственных осей

Вот некоторые примеры данных для работы (обычно полезно делиться такими образцами данных при задании вопросов по SO, поскольку другим людям легче реплицировать и решать ваши проблемы). Обратите внимание, что для этого примера мы пропустили использование пакета "xts", так как в этом нет необходимости.

set.seed(1)
dat <- data.frame(date = paste0(rep(1975:1977, each = 12), 
                                "M", rep(1:12, times = 3)),
                  x1 = runif(36, min = 100, max = 140),
                  x2 = runif(36, min = 100, max = 140))
library(zoo) # xts is actually unnecessary if this is all you're doing
# Convert your data to a `zoo` object
dat.z <- zoo(dat[-1], order.by = as.yearmon(dat$date, "%YM%m"))

Это график по умолчанию, полученный сplot(dat.z, screen = 1, col = 1:2):

Из ваших комментариев кажется, что вы хотите что-то вроде ежемесячных ярлыков.

График данных, но подавить ось X сxaxt = "n"

plot(dat.z, screen = 1, col = 1:2, xaxt = "n")

Выполните некоторые настройки, чтобы иметь метку для каждого месяца. (Видеть?plot.zooоткуда это модифицируется.)

tt <- time(dat.z)
# The following is just the sequence 1:36. 
#   If you wanted only every third month plotted,
#   use a sequence like ix <- seq(1, length(tt), 3)
ix <- seq_along(tt) 
# What format do you want for your labels.
#   This yields abbreviated month - abbreviated year
fmt <- "%b-%y" 
labs <- format(tt, fmt) # Generate the vector of your labels

Добавьте свою ось к вашему графику. Некоторый эксперимент может потребоваться, чтобы найти правильные размеры для всего.las = 2 делает метки перпендикулярно оси, что требуется, если выдействительно чувствую необходимость включать ярлык на каждый месяц каждого года.

axis(side = 1, at = tt[ix], labels = labs[ix], 
     tcl = -0.7, cex.axis = 0.7, las = 2)

Вот окончательный сюжет:

Кстати, если вы получаете такие даты, как1977.15 и так далее, вы можете прочитать некоторые ответына этот вопроснапример, глядя на использование @ Джораномpretty().

 Anusha25 окт. 2012 г., 15:50
Эта проблема возникает, когда я строю каждую серию по отдельности и когда число наблюдений больше 8. Но даже для большего количества наблюдений у нас должен быть способ расставить оси тиков, как требуется.
 Anusha25 окт. 2012 г., 20:39
Спасибо за подробный ответ. Несколько вопросов: 1. Почему значения по оси Y так сильно раздуваются? 2. Можно ли построить временной ряд, как любой график x-y, время по оси x и ряд по оси y, как это и есть на самом деле. Почему галочки не занимают диапазон значений данных? 3. Почему команда hydroTSM drawTimeAxis не работает и выдает ошибку измерения?
 A5C1D2H2I1M1N2O1R2T125 окт. 2012 г., 15:15
@ Anusha, Пожалуйста, поделитесь некоторыми данными (они могут быть составлены), которые демонстрируют вашу проблему, иначе мы не сможем помочь вам эффективно.
 Anusha25 окт. 2012 г., 15:43
Это те же данные, что и у нас, только более длинные временные ряды. При проверке головы (данных) и класса показывает ts, mts. Я попытался с 12 obs (может быть, тики скрываются, чтобы сэкономить место), а затем в показывает тиковые метки как 2010.0, .... 2010.8, и там также не дают ярлыки jan feb. Я думал, что добавление информации о времени позволяет более детальную временную ось. И не знаю, почему у оси Y завышены значения от 38000 до 44000.
 Anusha25 окт. 2012 г., 14:16
Спасибо за ответ. Набор данных как объект xts выглядит только в формате, показанном в конце, но на графиках нет меток месяца? Каков наилучший способ выбора оси тиков?

Используя ваши данные:

dat <- read.table(text = "date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33", header = TRUE)

Вам не хватает того, что вам нужно добавить день в ваши даты, чтобы они были действительными дляas.Date(), Этот бит можно сделать, добавив"-01" к каждому элементуdate, Нам нужно добавить"-" разделитель, чтобы четко отделить месяц от нового дня, который мы добавляем.

paste0(as.character(date), "-01") ## temporary step, not needed

Теперь у нас есть то, что напоминает

> with(dat, paste0(date, "-01"))  ## temporary step, not needed
 [1] "1975M1-01"  "1975M2-01"  "1975M3-01"  "1975M4-01"  "1975M5-01" 
 [6] "1975M6-01"  "1975M7-01"  "1975M8-01"  "1975M9-01"  "1975M10-01"
[11] "1975M11-01" "1975M12-01"

Мы можем выписать соответствующий формат, которыйas.Date() можно использовать:"%YM%m-%d", Обратите внимание, что здесь мы включаем буквальный"M" и разделитель перед дневной частью"-".

Помещая это вместе сtransform() вставить результат обратно вdat у нас есть:

## full solution
dat <- transform(dat, date = as.Date(paste0(date, "-01"), format = "%YM%m-%d"))

Который дает

> dat
         date      x     x2
1  1975-01-01 112.44 113.12
2  1975-02-01 113.10 114.36
3  1975-03-01 115.04 114.81
4  1975-04-01 117.65 115.35
5  1975-05-01 119.50 116.92
6  1975-06-01 121.40 118.56
7  1975-07-01 120.64 118.97
8  1975-08-01 119.12 119.84
9  1975-09-01 118.91 120.59
10 1975-10-01 120.58 122.30
11 1975-11-01 121.26 123.35
12 1975-12-01 122.34 123.33
 Anusha03 нояб. 2012 г., 07:40
+1 Спасибо за этот метод. Кажется, лучше конвертировать данные в стандартный формат для последующего анализа.

Ваш ответ на вопрос