Разделение значений времени и даты из столбца timestamp / DateTime в формате ffdf - PullRequest
0 голосов
/ 16 января 2020

Я относительно новый пользователь R, и это мой первый вопрос по StackOverflow, поэтому прошу прощения, если мой вопрос неясен или явно задан где-то еще.

У меня есть большой набор данных (7,8 ГБ, 137 миллионов наблюдений), который я загрузил в R в формате ffdf, так как я понимаю, что это позволит мне манипулировать данными (с целью уменьшить их до управляемый размер) без сбоев на моем компьютере.

Мой набор данных состоит из шести функций, одна из которых представляет собой метку времени в формате «2012-10-12 00:30:00 BST». Поскольку каждое наблюдение (показания электричества) проводится ровно через каждые полчаса, я хотел бы классифицировать данные, по которым из 48 получасовых часов дня проводится наблюдение. Поэтому в качестве первого шага я хотел бы отделить дату и время от метки времени. (Цель после этого состоит в том, чтобы кодировать этот столбец времени от 1 до 48 для каждого получаса.)

Следующий код работал для создания нового столбца даты:

ff1$date <- as.character(as.Date(ff1$DateTime))

Однако я изо всех сил пытаюсь сделать то же самое для времени и попробовал несколько методов, основанных на, возможно, грубом копировании из других примеров.

(1) ff1$time <- as.POSIXct(strptime(as.character(ff1$DateTime),"%T"))

(2) ff1$time <- strptime(ff1$DateTime,"%Y-%m-%d %H:%M:%S")

(3) ff1$time <- sapply(strptime(as.character(ff1$DateTime)," "), "[", 2)

Ни одна из этих работ. Ошибки для каждой из трех приведенных выше строк:

(1) Error in strptime(as.character(ff1$DateTime), "%T") : invalid 'x' argument

(2) Error in strptime(ff1$DateTime, "%Y-%m-%d %H:%M:%S") : invalid 'x' argument

(3) Error in strptime(as.character(ff1$DateTime), " ") : invalid 'x' argument

Это потому, что данные в формате fdff? Есть ли другие способы сделать это?

Заранее большое спасибо!

Arjun

dput:

structure(list(LCLid = structure(c(1L, 1L, 1L, 1L), .Label = "MAC000002", class = "factor"), 
    stdorToU = structure(c(1L, 1L, 1L, 1L), .Label = "Std", class = "factor"), 
    DateTime = structure(c(1349998200, 1.35e+09, 1350001800, 
    1350003600), tzone = "", class = c("POSIXct", "POSIXt")), 
    KWH.hh..per.half.hour. = structure(c(1L, 1L, 1L, 1L), .Label = " 0 ", class = "factor"), 
    Acorn = structure(c(1L, 1L, 1L, 1L), .Label = "ACORN-A", class = "factor"), 
    Acorn_grouped = structure(c(1L, 1L, 1L, 1L), .Label = "Affluent", class = "factor"), 
    date = structure(c(1L, 2L, 2L, 2L), .Label = c("2012-10-11", 
    "2012-10-12"), class = "factor")), row.names = c("1", "2", 
"3", "4"), class = "data.frame")

заголовки соответствующих столбцов:

      LCLid            DateTime
1 MAC000002 2012-10-12 00:30:00
2 MAC000002 2012-10-12 01:00:00
3 MAC000002 2012-10-12 01:30:00
4 MAC000002 2012-10-12 02:00:00
5 MAC000002 2012-10-12 02:30:00
6 MAC000002 2012-10-12 03:00:00

Ответы [ 3 ]

1 голос
/ 16 января 2020

Код, который вы пытаетесь выдавать ошибки, вероятно, потому что столбец "DateTime не относится к классу "POSIXt", "POSIXct". Поэтому сначала приведите к классу даты / времени, а затем извлеките только время.

ff1$DateTime <- as.POSIXct(ff1$DateTime)
format(ff1$DateTime, format = "%T")
#[1] "00:30:00"

Edit.

Если приведенное выше дает ошибку, попробуйте

ff1$DateTime <- as.POSIXct(as.character(ff1$DateTime))
format(ff1$DateTime, format = "%T")

Данные.

ff1 <- data.frame(DateTime = "2012-10-12 00:30:00 BST")
1 голос
/ 16 января 2020

Если вы часто используете даты и время, lubridate может оказаться полезным. Здесь я использую ymd_hms() для преобразования y ear- m onth- d ay h our- m inute- s второй формат в фактическое время. Затем используйте формат.

Это не существенно отличается от других решений, просто это другой способ преобразования обратно в дату и время.

Код:

library(lubridate)

ff1$time <- format(ymd_hms(ff1$DateTime), format = "%H:%M:%S")

Результат:

> ff1
      LCLid stdorToU            DateTime KWH.hh..per.half.hour.   Acorn Acorn_grouped       date     time
1 MAC000002      Std 2012-10-11 19:30:00                     0  ACORN-A      Affluent 2012-10-11 19:30:00
2 MAC000002      Std 2012-10-11 20:00:00                     0  ACORN-A      Affluent 2012-10-12 20:00:00
3 MAC000002      Std 2012-10-11 20:30:00                     0  ACORN-A      Affluent 2012-10-12 20:30:00
4 MAC000002      Std 2012-10-11 21:00:00                     0  ACORN-A      Affluent 2012-10-12 21:00:00
0 голосов
/ 16 января 2020

Вы можете использовать strsplit.

sapply(strsplit(as.character(dat$x), " "), `[`, 1)
# [1] "2012-10-12" "2012-10-12" "2012-10-12" "2012-10-12" "2012-10-12"
sapply(strsplit(as.character(dat$x), " "), `[`, 2)
# [1] "00:30:00" "00:30:00" "00:30:00" "00:30:00" "00:30:00"

Данные:

x <- "2012-10-12 00:30:00 BST"
dat <- data.frame(x=replicate(5, x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...