Подтвердить что ты не робот

Вставить строки для отсутствующих дат/раз

Я новичок в R, но обратился к нему, чтобы решить проблему с большим набором данных, который я пытаюсь обработать. В настоящее время у меня есть 4 столбца данных (значения Y), установленные против временных интервалов минут (месяц/день/год: мин) (значения X), как показано ниже:

    timestamp          tr            tt         sr         st  
1   9/1/01 0:00   1.018269e+02   -312.8622   -1959.393   4959.828  
2   9/1/01 0:01   1.023567e+02   -313.0002   -1957.755   4958.935  
3   9/1/01 0:02   1.018857e+02   -313.9406   -1956.799   4959.938  
4   9/1/01 0:03   1.025463e+02   -310.9261   -1957.347   4961.095  
5   9/1/01 0:04   1.010228e+02   -311.5469   -1957.786   4959.078

Проблема заключается в том, что некоторые значения временных меток отсутствуют - например, может быть разрыв между 9/1/01 0:13 и 9/1/01 0:27, и такие пробелы нерегулярны по набору данных. Мне нужно поместить несколько из этих рядов в одну и ту же базу данных и потому, что недостающие значения различны для каждой серии, даты в настоящее время не выравниваются в каждой строке.

Я хотел бы генерировать строки для этих отсутствующих временных меток и заполнять столбцы Y пустым значением (без данных, а не с нулем), так что у меня есть непрерывный временной ряд.

Я честно не совсем уверен, с чего начать (на самом деле не использовал R до того, чтобы учиться, когда я продвигаюсь!), но любая помощь была бы высоко оценена. Я до сих пор устанавливал хрон и зоопарк, так как кажется, что они могут быть полезны.

Спасибо!

4b9b3361

Ответ 1

Я думаю, что проще всего установить Date сначала как уже описано, конвертировать в зоопарк, а затем просто установить слияние:

df$timestamp<-as.POSIXct(df$timestamp,format="%m/%d/%y %H:%M")

df1.zoo<-zoo(df[,-1],df[,1]) #set date to Index

df2 <- merge(df1.zoo,zoo(,seq(start(df1.zoo),end(df1.zoo),by="min")), all=TRUE)

Начало и конец даны из вашего df1 (исходные данные), и вы устанавливаете - например, min - как вам нужно для вашего примера. all = TRUE устанавливает все отсутствующие значения в отсутствующие даты для NA.

Ответ 2

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

library(dplyr)

ts <- seq.POSIXt(as.POSIXct("2001-09-01 0:00",'%m/%d/%y %H:%M'), as.POSIXct("2001-09-01 0:07",'%m/%d/%y %H:%M'), by="min")

ts <- seq.POSIXt(as.POSIXlt("2001-09-01 0:00"), as.POSIXlt("2001-09-01 0:07"), by="min")
ts <- format.POSIXct(ts,'%m/%d/%y %H:%M')

df <- data.frame(timestamp=ts)

data_with_missing_times <- full_join(df,original_data)

   timestamp     tr tt sr st
1 09/01/01 00:00 15 15 78 42
2 09/01/01 00:01 20 64 98 87
3 09/01/01 00:02 31 84 23 35
4 09/01/01 00:03 21 63 54 20
5 09/01/01 00:04 15 23 36 15
6 09/01/01 00:05 NA NA NA NA
7 09/01/01 00:06 NA NA NA NA
8 09/01/01 00:07 NA NA NA NA

Также, используя dplyr, это облегчает выполнение чего-то вроде изменения всех этих недостающих значений на что-то еще, что мне пригодится при построении графика в ggplot.

data_with_missing_times %>% group_by(timestamp) %>% mutate_each(funs(ifelse(is.na(.),0,.)))

   timestamp     tr tt sr st
1 09/01/01 00:00 15 15 78 42
2 09/01/01 00:01 20 64 98 87
3 09/01/01 00:02 31 84 23 35
4 09/01/01 00:03 21 63 54 20
5 09/01/01 00:04 15 23 36 15
6 09/01/01 00:05  0  0  0  0
7 09/01/01 00:06  0  0  0  0
8 09/01/01 00:07  0  0  0  0

Ответ 3

Заполнение даты реализовано в пакете padr в R. Если вы храните свой фрейм данных, ваша переменная date-time хранится как POSIXct или POSIXlt. Все, что вам нужно сделать, это:

library(padr)
pad(df_name)

См. виньетку ( "padr" ) или эту запись в блоге для ее работы.

Ответ 4

# some made-up data
originaldf <- data.frame(timestamp=c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:04"),
    tr = rnorm(4,0,1),
    tt = rnorm(4,0,1))

originaldf$minAsPOSIX <- as.POSIXct(originaldf$timestamp, format="%m/%d/%y %H:%M", tz="GMT")

# Generate vector of all minutes
ndays <- 1 # number of days to generate
minAsNumeric <- 60*60*24*243 + seq(0,60*60*24*ndays,by=60)

# convert those minutes to POSIX
minAsPOSIX <- as.POSIXct(minAsNumeric, origin="2001-01-01", tz="GMT")

# new df
newdf <- merge(data.frame(minAsPOSIX),originaldf,all.x=TRUE, by="minAsPOSIX")

Ответ 5

Если вы хотите заменить значения NA, полученные любым способом, упомянутым выше, нолями, вы можете сделать это:

df[is.na(df)] <- 0

(Я первоначально хотел прокомментировать это на ответе Иболлара, но мне не хватает необходимой репутации, таким образом, я опубликовал в качестве ответа)

Ответ 6

df1.zoo <- zoo(df1[,-1], as.POSIXlt(df1[,1], format = "%Y-%m-%d %H:%M:%S")) #set date to Index: Notice that column 1 is Timestamp type and is named as "TS"

full.frame.zoo <- zoo(NA, seq(start(df1.zoo), end(df1.zoo), by="min")) # zoo object
full.frame.df  <- data.frame(TS = as.POSIXlt(index(full.frame.zoo), format = "%Y-%m-%d %H:%M:%S")) # conver zoo object to data frame

full.vancouver <- merge(full.frame.df, df1, all = TRUE) # merge

Ответ 7

Я искал нечто похожее, вместо того, чтобы заполнять отсутствующие временные метки, мои данные были в месяцах и днях. Поэтому я хотел создать последовательность месяцев, которая будет обслуживать високосные годы и т.д. Я использовал lubridate:

date <- df$timestamp[1]
date_list <- c(date)
while (date < df$timestamp[nrow(df)]){
    date <- date %m+% months(1) 
    date_list <- c(date_list,date)
}
date_list <- format(as.Date(date_list),"%Y-%m-%d")
df_1 <- data.frame(months=date_list, stringsAsFactors = F)

Это даст мне список дат в возрастающие месяцы. Затем присоединяюсь к

df_with_missing_months <- full_join(df_1,df)

Ответ 8

Есть некоторые достижения в обработке данных временных рядов в R, например, пакет tsibble добавил такие манипуляции с временными рядами аккуратно:

library(tsibble)
library(lubridate)

ts <- lubridate::dmy_hm(c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:27"))
originaldf <- tsibble(timestamp = ts,
                      tr        = rnorm(4,0,1),
                      tt        = rnorm(4,0,1),
                      index     = timestamp)

originaldf %>% 
  fill_gaps()

Ответ 9

Я думаю, что это можно сделать с помощью пакета complete in tidyr.

library(tidyverse)
df <- df %>%
      complete(timestamp = seq.POSIXt(min(timestamp), max(timestamp), by = "minute"), 
               tr, tt, sr,st)

Вы также можете инициализировать дату начала и дату окончания вместо использования min(timestamp) и max(timestamp).