我正在使用GPS数据从轨道中发现个人有意义的地方。一旦集群数据并将每个点分配给集群,您将获得输出文件,其中列中包含时间戳和集群ID列。为了确定一个人每次访问每个群集的时间长度,您必须按时间戳对数据进行排序,并从同一群集中查找所有读数序列。说我有一个id模式1,1,1,2,3,4,4,1,1,2,1,3,3,4,4,1,1,1,1,1并且已经排序了按时间戳 - 在这里你可以看到一个人访问集群1四次。我想知道的是如何计算每次访问群集时人员在群集1中停留的时间。结果可能是一个字典,其中cluster id是键,后面跟着表示每次访问花费的时间的值,代码的输入可以是2D list,其中每个元素都包含主题数据[timestamp,Lat,Lon,cluster_id]。
数据示例(时间为纪元时间,以秒为单位):
时间|集群
1377997076 | 1
1378000582 | 1
1378000596 | 1
1378031297 | 2
1378031302 | 2
1378031303 | 1
1378031345 | 1
1378033452 | 2
1378034222 | 2
那也可以表示为2d列表:mylist = [[1377997076,1],[1378000582,1],[1378000596,1],[1378031297,2],[1378031302,2],[1378031303,1] [1378031345,1],[1378033452,2],[1378034222,1]]
答案 0 :(得分: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中每个相应停留的长度。