Как отобразить только временную часть метки времени, включая дату? - PullRequest
13 голосов
/ 05 октября 2011

Итак, у меня есть такой набор временных меток:

datetime<-c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00")

Я хочу сделать гистограмму только из времен.Я разбил столбец на пробел, чтобы получить только время, а затем преобразовал обратно в объект POSIXct, чтобы qplot построил его:

library(ggplot2, stringr)    
qplot(as.POSIXct(strptime((str_split_fixed(as.character(time), " ", 2)[,2]), "%H:%M:%S")))

Однако вывод as.POSIXct(strptime((str_split_fixed(as.character(datetime), " ", 2)[,2]), "%H:%M:%S"))

"2011-10-04 03:33:00 PDT" "2011-10-04 13:41:00 PDT" "2011-10-04 16:14:00 PDT" "2011-10-04 11:01:00 PDT" "2011-10-04 06:35:00 PDT" "2011-10-04 12:48:00 PDT"

qplot готовит то, что я хочу, но это кажется мне запутанным взломом.Конечно, есть лучший способ сделать это?Я мог бы преобразовать это в эпоху времени и построить график, но я пытался избежать необходимости делать это в качестве дополнительного шага.

Большой вопрос: «Как я могу контролировать вывод strptime?»

Ответы [ 2 ]

15 голосов
/ 05 октября 2011

Как насчет этого подхода?

require("ggplot2")
dtstring <- c(
  "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00",
  "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00"
)
dtPOSIXct <- as.POSIXct(dtstring)

# extract time of 'date+time' (POSIXct) in hours as numeric
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days"))

p <- qplot(dtTime) + xlab("Time slot") + scale_x_datetime(format = "%S:00")
print(p)

Вычисление dtPOSIXct - trunc(dtPOSIXct, "days") извлекает время объектов класса POSIXct в часах.

plot(p)

Для ggplot2-0.9.1:

require("ggplot2")
require("scales")
dtstring <- c(
  "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00",
  "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00"
)
dtPOSIXct <- as.POSIXct(dtstring)

# extract time of 'date+time' (POSIXct) in hours as numeric
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days"))

p <- qplot(dtTime) + xlab("Time slot") +
     scale_x_datetime(labels = date_format("%S:00"))
print(p)

Для ggplot2-0.9.3.1:

require("ggplot2")
require("scales")
dtstring <- c(
  "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00",
  "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00"
)
dtPOSIXct <- as.POSIXct(dtstring)

# extract time of 'date+time' (POSIXct) in hours as numeric
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days"))
class(dtTime) <- "POSIXct"

p <- qplot(dtTime) + xlab("Time slot") +
     scale_x_datetime(labels = date_format("%S:00"))
print(p)
4 голосов
/ 05 октября 2011

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

dtstring <- c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00")
datetime <- as.POSIXct(dtstring)
library(ggplot2)
qplot(datetime)

Формат ваших строк по умолчанию используется для анализа с as.POSIXct, подробности см. ?strptime или если у вас есть что-то другоеэтот формат.

Если вы хотите использовать конкретный формат строки из значений даты и времени, используйте format, как в

format(datetime, "%d-%b")
[1] "28-Sep" "24-Aug" "19-Sep" "18-Aug" "17-Sep" "15-Aug"

Снова, смотрите ?strptime для получения подробной информации.Если вы действительно хотите уничтожить значения времени, вы можете использовать класс Date.Просто помните, что дата-время или даты нуждаются в их полной структуре, любое другое представление - это просто отформатированный текст.

qplot (as.Date (datetime))

...