2016-07-26 9 views
1

のタイムスタンプが見つからないため、私はRで今すぐ最初のステップを実行しようとしています。問題はこれです:私は、データの半年で秒単位のCSVファイルを持って、それは次のようになります。R:データサイズのためにPHP/MySQLまたはExcelの問題を解決できなかったため、csv

metering,timestamp 
123,2016-01-01 00:00:00 
345,2016-01-01 00:00:01 
243,2016-01-01 00:00:02 
101,2016-01-01 00:00:04 
134,2016-01-01 00:00:06 

ご覧のとおり、いくつかの秒(しばらく一度の欠落があります私に尋ねないでください、値がタイムスタンプの前に書かれているのはなぜですか?それがデータを受け取った方法です...)。今、値の量(=秒)を計算しようとしています。

だから私の考えは新しいベクトルを持つファイル、および

  • 合計与えられたCSVと一致
  • 、(すべての秒ごとの秒のタイムスタンプが含まれます)正しいベクトルを作成するために

    1. ました価値のないすべてのタイムスタンプをアップする。

      "1",2016-01-01 00:00:00 
      "2",2016-01-01 00:00:01 
      "3",2016-01-01 00:00:02 
      "4",2016-01-01 00:00:03 
      "5",2016-01-01 00:00:04 
      "6",2016-01-01 00:00:05 
      "7",2016-01-01 00:00:06 
      

      RegularTimeSeries <- seq(as.POSIXct("2016-01-01 00:00:00", tz = "UTC"), as.POSIXct("2016-01-01 00:00:30", tz = "UTC"), by = "1 sec") 
      write.csv(RegularTimeSeries, file = "RegularTimeSeries.csv") 
      

      は、私もこのようになりますCSVへのベクトルをエクスポート私がやったアイデアを持っている:

    は、私は、ステップ1は、次のコードで実現するために管理しました

    残念ながら私はステップ2と3を続行する方法がわかりません。非常によく似た例がいくつか見つかりましたが(http://www.r-bloggers.com/fix-missing-dates-with-r/R: Insert rows for missing dates/times)、私はこれらの例を自分のsec-by-secデータに変換するのに苦労しました。

    新参者のためのいくつかのヒントは非常に非常に役立つだろう - 事前にどうもありがとうございました:)

  • +1

    よく、私はあなたのメスod、その前の値でタイムスタンプを減算するだけです。 1より大きい場合は、値を出力します。他の賢明なそれを残す。しばらくの間にコードを共有します。 –

    +0

    ありがとうございます!はい、私が持っているデータの行で「秒」を差し引くのが最も明白な解決策です(私はこの考えが正直ではないことを明らかにしています)。とにかく、データの最長停電がどこで発生したか、どこでどのくらいの時間がかかったかなどを調べるなど、何らかのさらなる分析が私の心に残っていました。これを行うには、とにかく「NA」の値を持つデータセットが必要です。しかし、最初のステップでは、あなたのソリューションは、もちろん簡単です:) – Bene

    +0

    答えとして私のコードを与えました、ベネ。チェックして助けてくれたら教えてください –

    答えて

    0

    あなたが望むすべてが欠落している秒数であれば、それははるかに簡単に行うことができます。まず、あなたのtimerangeの秒数を見つけて、データセットの行数を引いてください。これらの行に沿ってRで行うことができます。

    n.seconds <- difftime("2016-06-01 00:00:00", "2016-01-01 00:00:00", units="secs") 
    n.rows <- nrow(my.data.frame) 
    n.missing.values <- n.seconds - n.rows 
    

    データフレームの時間範囲と変数を変更することがあります。 tidyverseで

    +0

    'min'と' max'を使って減算する時間を計算すると(そしておそらく既存の 'NA'sを考慮して)、これは良い解決策です。 – alistaire

    1

    library(dplyr) 
    library(tidyr) 
    
         # parse datetimes 
    df %>% mutate(timestamp = as.POSIXct(timestamp)) %>% 
        # complete sequence to full sequence from min to max by second 
        complete(timestamp = seq.POSIXt(min(timestamp), max(timestamp), by = 'sec')) 
    
    ## # A tibble: 7 x 2 
    ##    timestamp metering 
    ##    <time> <int> 
    ## 1 2016-01-01 00:00:00  123 
    ## 2 2016-01-01 00:00:01  345 
    ## 3 2016-01-01 00:00:02  243 
    ## 4 2016-01-01 00:00:03  NA 
    ## 5 2016-01-01 00:00:04  101 
    ## 6 2016-01-01 00:00:05  NA 
    ## 7 2016-01-01 00:00:06  134 
    

    あなたはNA S(つまり、データのない秒数)の数は、

    %>% tally(is.na(metering)) 
    
    ## # A tibble: 1 x 1 
    ##  n 
    ## <int> 
    ## 1  2 
    
    +1

    ありがとう、これは私が探しているもののように見えます!残念ながら、結果は得られません - どこかの行を追加する必要がありますか?私は "df"は元のデータを持つベクトルで、 'df < - read.csv(fpath、header = TRUE、sep ="、 ")'で読むことができると思いますか? – Bene

    +0

    'df < - read.csv(fpath)'を使うことができます。他のパラメータはすでにデフォルトです。結果を保存するには、結果を何かに割り当てます。 'DF2 <- df %>%ののmutate(....' – alistaire

    +0

    はい!それは働いていたので、ありがとうございました! – Bene

    1

    に追加したい場合は、あなたのどの値を確認することができますRegularTimeSeriesは、which%in%を使用して壊れた時系列です。まず、あなたの例からBrokenTimeSeriesを作成します。これはあなたBrokenTimeSeriesではありませんRegularTimeSeries内の値のindecesを与える

    RegularTimeSeries <- seq(as.POSIXct("2016-01-01 00:00:00", tz = "UTC"), as.POSIXct("2016-01-01 00:00:30", tz = "UTC"), by = "1 sec") 
    BrokenTimeSeries <- RegularTimeSeries[-c(3,6,9)] # remove some seconds 
    

    > RegularTimeSeries[which(!(RegularTimeSeries %in% BrokenTimeSeries))] 
    [1] "2016-01-01 00:00:02 UTC" "2016-01-01 00:00:05 UTC" "2016-01-01 00:00:08 UTC" 
    

    > which(!(RegularTimeSeries %in% BrokenTimeSeries)) 
    [1] 3 6 9 
    

    をこれが実際の値を返します。

    多分私はあなたの問題を誤解していますが、単に秒数を数えるとlengthあなたの壊れた時系列のRegularTimeSeriesから、または上の2つの結果のベクトルのいずれかの長さを得る。

    > length(RegularTimeSeries) - length(BrokenTimeSeries) 
    [1] 3 
    > length(which(!(RegularTimeSeries %in% BrokenTimeSeries))) 
    [1] 3 
    > length(RegularTimeSeries[which(!(RegularTimeSeries %in% BrokenTimeSeries))]) 
    [1] 3 
    

    あなたはこのような何かを行うことができ欠損値を参照するために一緒にファイルをマージする場合:その結果

    #data with regular time series and a "step" 
    df <- data.frame(
        RegularTimeSeries 
    ) 
    
    df$BrokenTimeSeries[RegularTimeSeries %in% BrokenTimeSeries] <- df$RegularTimeSeries 
    df$BrokenTimeSeries <- as.POSIXct(df$BrokenTimeSeries, origin="2015-01-01", tz="UTC") 
    

    > df[1:12,] 
        RegularTimeSeries BrokenTimeSeries 
    1 2016-01-01 00:00:00 2016-01-01 00:00:00 
    2 2016-01-01 00:00:01 2016-01-01 00:00:01 
    3 2016-01-01 00:00:02    <NA> 
    4 2016-01-01 00:00:03 2016-01-01 00:00:02 
    5 2016-01-01 00:00:04 2016-01-01 00:00:03 
    6 2016-01-01 00:00:05    <NA> 
    7 2016-01-01 00:00:06 2016-01-01 00:00:04 
    8 2016-01-01 00:00:07 2016-01-01 00:00:05 
    9 2016-01-01 00:00:08    <NA> 
    10 2016-01-01 00:00:09 2016-01-01 00:00:06 
    11 2016-01-01 00:00:10 2016-01-01 00:00:07 
    12 2016-01-01 00:00:11 2016-01-01 00:00:08 
    
    +0

    それは、包括的なポストである。プラス1。 – akrun

    0

    はそれが

    を役に立てば幸い
    d <- (c("2016-01-01 00:00:01", 
    "2016-01-01 00:00:02", 
    "2016-01-01 00:00:03", 
    "2016-01-01 00:00:04", 
    "2016-01-01 00:00:05", 
    "2016-01-01 00:00:06", 
    "2016-01-01 00:00:10", 
    "2016-01-01 00:00:12", 
    "2016-01-01 00:00:14", 
    "2016-01-01 00:00:16", 
    "2016-01-01 00:00:18", 
    "2016-01-01 00:00:20", 
    "2016-01-01 00:00:22")) 
    d <- as.POSIXct(d) 
    
    for (i in 2:length(d)){ 
        if(difftime(d[i-1],d[i], units = "secs") < -1){ 
        c[i] <- d[i] 
        } 
        } 
    class(c) <- c('POSIXt','POSIXct') 
    c 
    [1] NA      NA      NA      
    NA      NA      
    [6] NA      "2016-01-01 00:00:10 EST" "2016-01-01 00:00:12  
    EST" "2016-01-01 00:00:14 EST" "2016-01-01 00:00:16 EST" 
    [11] "2016-01-01 00:00:18 EST" "2016-01-01 00:00:20 EST" "2016-01-01  
    00:00:22 EST" 
    
    関連する問題