web-dev-qa-db-ja.com

欠落している日付/時刻の行を挿入する

私はRを初めて使用しますが、処理しようとしている大きなデータセットの問題を解決するためにRを使用しました。現在、次のように、分間隔のタイムスタンプ(月/日/年時:分)(X値)に対して設定された4列のデータ(Y値)があります。

    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を使ったことがないので、学習しながら学習します!)。どんな助けでも大歓迎です。これまでにchronとZooをインストールしたことがあります。

ありがとう!

39
James A

最も簡単なのは、すでに説明したように最初に日付を設定し、Zooに変換してから、マージを設定することです。

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に設定します。

23
Herr Student

これは古い質問ですが、同様の問題に対する答えを探しているときにこの投稿に出くわしたので、これを処理する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
34
lbollar

日付パディングは、Rのpadrパッケージに実装されています。データフレームを保存する場合、日時変数はPOSIXctまたはPOSIXltとして保存されます。あなたがする必要があるのは:

library(padr)
pad(df_name)

動作については、vignette( "padr")またはこのブログ投稿を参照してください。

14
Edwin
# 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")
2
Thomas

上記の方法で取得したNA値をゼロに置き換える場合は、次のようにします。

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

(元々はIbollarの回答についてこれをコメントしたかったのですが、必要な評判が足りなかったため、回答として投稿しました)

1
s-heins

これは、completeパッケージでtidyrを使用することで実現できると思います。

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

min(timestamp)max(timestamp)を使用する代わりに、開始日と終了日を初期化することもできます。

1
Ashish Singhal

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()
0
Simon Müller
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
0
Rotail

私は、データが月と日で失われたタイムスタンプを埋める代わりに、似たようなものを探していました。そこで、うるう年などに対応する月のシーケンスを生成したかったのです。私は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)
0
Kevin Ogoro