0

GPS データを使用して、トラックから個人的に意味のある場所を発見しています。データをクラスター化し、各ポイントをクラスターに割り当てると、他の列の中にタイムスタンプとクラスター ID の列がある出力ファイルが得られます。人が各クラスターを訪問するたびに滞在した時間を判断するには、データをタイムスタンプで並べ替え、すべて同じクラスターから一連の読み取り値を見つける必要があります。IDパターン1,1,1,2,3,4,4,1,1,2,1,3,3,4,4,1,1,1,1,1があり、それはすでにソートされているとしますタイムスタンプ別 - ここでは、ある人がクラスター 1 を 4 回訪れたことがわかります。私が知りたいのは、その人がクラスター1を訪れるたびに、クラスター1に滞在した時間を計算する方法です。

データの例 (時間は秒単位のエポック時間):
時間 | クラスター
1377997076 | 1
1378000582 | 1
1378000596 | 1
1378031297 | 2
1378031302 | 2
1378031303 | 1
1378031345 | 1
1378033452 | 2
1378034222 | 2

これは、次の 2 次元リストとして表すこともできます。 ,1],[1378033452,2],[1378034222,1]]

4

1 に答える 1

0

開始するコードは次のとおりです。

def chunk_sequences(it, n):
    """
    Yield all sequences of n from iterable.
    """
    chunk = []
    for x in it:
        if x == n:
            chunk.append(n)
        else:
            if len(chunk) > 0:
                yield chunk
                chunk = []
    if len(chunk) > 0:
        #needed in case the last sequence runs into the last element
        yield chunk

迅速かつ汚い、パフォーマンスが重要な場合は、itertools ベースのソリューションを使用することをお勧めします (おそらくtakewhile.

したがって、上記を使用すると、次のことができます。

list(chunk_sequences(pattern,1))
Out[59]: [[1, 1, 1], [1, 1], [1], [1, 1, 1, 1, 1]]

これは簡単に次のようになります。

[len(x) for x in list(chunk_sequences(pattern,1))]
Out[60]: [3, 2, 1, 5]

..これは、クラスター 1 のそれぞれの滞在の長さです。

于 2013-10-12T16:34:08.003 に答える