2016-10-25 24 views
2

私はPythonでいくつかのRコードを書き直そうとしていますが、ある特定のビットを越えることはできません。私は、foverlaps関数が時間ベースの結合を実行する際に非常に便利であることを発見しましたが、Python3でも同様に機能するものは見つかりませんでした。R foverlaps相当のPython

あるテーブルのtimeが別のテーブルのstart_timeend_timeの間にある2つのデータテーブルを結合しています。 2つのテーブルの周期性は同じではありません。table_Aは1秒ごとに発生し、各間隔で複数のエントリを持つことができます。table_Bは、不規則な間隔で0〜10分ごとに1つのエントリを持ちます。

# Add dummy column to use with foverlaps 
table_A <- table_A[, dummy := time] 

# Set keys 
setkey(table_B, x, y, start_time, end_time) 
setkey(table_A, x, y, time, dummy) 

# Join tables based on time 
joined <- foverlaps(table_A, table_B, type = "within", by.x=c("x", "y", "time", "dummy"), by.y=c("x", "y", "start_time", "end_time"), nomatch=0L)[, dummy := NULL] 


> head(table_A) 
    time       x  y  dummy 
1: 2016-07-11 11:52:27   4077 1  2016-07-11 11:52:27 
2: 2016-07-11 11:52:27   4077 1  2016-07-11 11:52:27 
3: 2016-07-11 11:52:27   4077 1  2016-07-11 11:52:27 
4: 2016-07-11 11:52:27   4077 1  2016-07-11 11:52:27 
5: 2016-07-11 11:52:32   4077 1  2016-07-11 11:52:32 
6: 2016-07-11 11:52:32   4077 1  2016-07-11 11:52:32 


> head(table_B) 
       x  y start_time    end_time 
1:    6183 1 2016-07-11 12:00:45  2016-07-11 12:00:56 
2:    6183 1 2016-07-11 12:01:20  2016-07-11 12:01:20 
3:    6183 1 2016-07-11 12:01:40  2016-07-11 12:03:26 
4:    6183 1 2016-07-11 12:04:20  2016-07-11 12:04:40 
5:    6183 1 2016-07-11 12:04:55  2016-07-11 12:04:57 
6:    6183 1 2016-07-11 12:05:40  2016-07-11 12:05:51 

ので、table_A内の任意の行は、時間がSTART_TIMEとの間に入る場所: Merge pandas dataframes where one value is between two others

次のコードでは、Rで自分の所望の出力を提供します。

この質問は、私が求めていますと非常によく似ていますend_timeはtable_Bの対応する行と結合され、以下のような出力が得られます。私はPythonでさまざまなことを試しましたが、解決策はまだ見つかりませんでした。

例データから明白でないかもしれない1つの事は、同じstart_timeend_timeの範囲内でtimeに複数のxとy値が発生することです。

> head(joined) 
    y  x  start_time    end_time    time 
1 1  4077 2016-07-11 12:00:45  2016-07-11 12:00:56  2016-07-11 12:00:46  
2 1  4077 2016-07-11 12:00:45  2016-07-11 12:00:56  2016-07-11 12:00:46  
3 1  4077 2016-07-11 12:00:45  2016-07-11 12:00:56  2016-07-11 12:00:46  
4 1  4077 2016-07-11 12:00:45  2016-07-11 12:00:56  2016-07-11 12:00:46  
5 1  4077 2016-07-11 12:00:45  2016-07-11 12:00:56  2016-07-11 12:00:46  
6 1  4077 2016-07-11 12:00:45  2016-07-11 12:00:56  2016-07-11 12:00:55 
+0

:中

dateparse = lambda x: pd.datetime.strptime(x, '%m/%d/%Y %H:%M:%S') table_A = pd.read_csv('data.csv', parse_dates=[0], date_parser=dateparse, dayfirst=False) table_B = pd.read_csv('data.csv', parse_dates=[0,1], date_parser=dateparse, dayfirst=False) 

または読み取り後:あなたは読まファイル中に型を変換することができます。おそらくasofまたは結合された結合がうまくいくかもしれないと思ったが運がない。私は基本的な方法ではないかもしれない私の試みの一つを修正しようとせずにいくつかのアイデアを得ることを望んでいた。 – Jeff

+3

'table_A'、' table_B'、および 'joined'のサンプルを提供できますか?(あなたが' A'と 'B'のために提供したサンプルを仮定して)見えますか?それを使って、私はあなたを助けることができます...他の誰かが私にそれを打つことがない場合 – piRSquared

+0

これを模倣する簡単な方法は['numpy.searchsorted'](https://docs.scipy.org/doc /numpy/reference/generated/numpy.searchsorted.html)、 'time'データを' start_time'と 'end_time'の配列にソートします。あなたのデータの構造に応じて、 'start_time'は使用する必要さえないかもしれません。 –

答えて

1

pandas.Series.between()を使用してサブセットと簡単にマージすることを検討してください。マージは結合列のすべての組み合わせを結合し、サブセットは時間間隔に合わせた行を保持します。

df = pd.merge(table_A, table_B, on=['x', 'y'])     
df = df[df['time'].between(df['start_time'], df['end_time'], inclusive=True)] 

しかし、一つの重要な項目は、あなたの日付が日時型としてキャストされなければならないです。現在、投稿には.between()に影響する文字列の日付が表示されます。以下は、月の最初の日付をMM/DD/YYYYと仮定しています。はい、私はパンダを使用しています

table_A['time'] = pd.to_datetime(table_A['time'], format='%m/%d/%Y %H:%M:%S') 

table_B['start_time'], table_B['end_time']=(pd.to_datetime(ser, format='%m/%d/%Y %H:%M:%S') \ 
            for ser in [table_B['start_time'], table_B['end_time']]) 
+0

どうしたの?私はあなたのサンプルデータを走らせましたが、空のデータフレームを返しました。11:52aは12pの後のレコードより前です。 – Parfait

+0

したがって、pd.mergeは小さなデータサンプル(標準データセットの約20分の1)を使用するだけで動作し、40M行のデータフレームを作成します。サブセットコードを実行しようとすると、すぐに私の16GBのメモリがいっぱいになり、完了しません。 table_A。 OUT [118]形状:(10961、25) table_B.shape OUT [119]:(3666、7) joined.shape OUT [120]:(40183026、30) – Jeff

+0

あなたはこの処理を実行する必要があるかもしれません特定の月ごとにAとBの両方をフィルタリングし、すべての月を一緒に連結するようなチャンクでこれらの大きなデータソースでRでdata.tableの 'foverlaps'を実行しましたか? – Parfait

関連する問題