2017-05-05 14 views
4
私は開始日、終了日と「粒度」

パンダ - 指定された開始日、終了日及び粒度

を使用して日時インデックス付きのデータフレームをリサンプリングする

を使用してデータフレームをリサンプリングは、私は、このデータフレームを持っていると言う:

    value 
00:00, 01/05/2017 2 
12:00, 01/05/2017 4 
00:00, 02/05/2017 6 
12:00, 02/05/2017 8 
00:00, 03/05/2017 10 
12:00, 03/05/2017 12 

そして、私は(これは簡単にするためにここにオリジナルと同じですが、なくてもかまいません)12時間の「粒度」で06:00, 01/05/2017から
18:00 02/05/2017に行くためにそれをリサンプリングします。私が欲しい結果は次のとおりです。値は、彼らが(例えば3 =平均(2,4))重複した値の平均値であることを

    value 
06:00, 01/05/2017 3 
18:00, 01/05/2017 5 
06:00, 02/05/2017 7 
18:00, 02/05/2017 9 

私はこれを行う方法がわかりませんよ。

私の最初の試みでした:これは、適切なデータフレームをトリミングして、正しい精度を保証しますが、結果があるので、開始日との結果を合わせていない

def resample(df: DataFrame, start: datetime, end: datetime, granularity: timedelta) -> DataFrame: 
    result = df.resample(granularity).mean() 
    result = result[result.index <= end] 
    result = result[result.index >= start] 
    return result 

    value 
12:00, 01/05/2017 4 
00:00, 02/05/2017 6 
12:00, 02/05/2017 8 

私の2番目の試みは、baseパラメータを使ってデータをシフトしました:

def resample(df: DataFrame, start: datetime, end: datetime, desired_granularity: timedelta) -> DataFrame: 
    data_before_start = df[df.index <= start] 
    # Get the last index value before our start date 
    last_date_before_start = data_before_start.last_valid_index() 
    current_granularity_secs = seconds_between_measurements(df) 
    rule = str(int(desired_granularity.total_seconds())) + 'S' 
    base = current_granularity_secs - (start - last_date_before_start).total_seconds() 
    result = df.resample(rule, base=base).mean() 
    result = result[result.index < end] 
    result = result[result.index >= start] 
    return result 

これは私を与える:

    value 
06:00, 01/05/2017 4 
18:00, 01/05/2017 6 
06:00, 02/05/2017 8 
18:00, 02/05/2017 10 

これは右のインデックスを有するが、値が前後の測定から次の測定からバックフィルではなく平均化されます。

誰かが私が欲しいものを達成する方法について考えている人はいますか?

あなたの助けを事前に感謝し、私はすべての重要な詳細を残してきたなら、私が知っている:)

EDIT: 平均値を得ることが、これは非常にトリッキーになるビットである場合、私は可能性がありpad()と同様に、指定された時刻より前の値を使用して解決します。私の現在のベストソリューションは、バックフィル()のように後に値を与えます

答えて

0

まず、end_start列とend_date列をdatetimeとして定義します。 DFに

  • を充填前方にdf.start_dateで

    • : その後、あなたは.resample 2回使用することができます。そして

    を充填後方とEND_DATE:START_DATE < END_DATE

    • キープ行を連結
    • はSTART_DATEとEND_DATEを更新するために、各行に関数を適用する:

    ここにコード:

    df[["start_date","end_date"]] = df[["start_date","end_date"]].astype(np.datetime64) 
    df1 = df.set_index("start_date").resample(freq).pad().reset_index() 
    df2 = df.set_index("end_date").resample(freq).bfill().reset_index() 
    df3 = pd.concat([df1, df2], ignore_index=True) 
    
    def function(x, df1): 
        if x.name < df1.shape[0]: 
         x.end_date = x.start_date + pd.Timedelta(freq) 
        else: 
         x.start_date = x.end_date - pd.Timedelta(freq) 
        return x 
    
    df3[ df3.start_date < df3.end_date ].apply(lambda x: function(x, df1), axis=1) 
    

    パンダドキュメントは直接リサンプリングすることが可能であることを言う

    df.resample(freq, on='start_date')

  • 関連する問題