2013-03-21 24 views
0

我有一個包含某些用戶的位置信息的大數據文件。格式如下所示:Python:如何獲得在某個位置花費的時間分佈

User  TimeStamp   Lat  Long 
    A 2013-03-01 19:55:00  45.4565 65.6783 
    A 2013-03-01 01:40:00  46.3121 -12.3456 
    A 2013-03-02 11:25:00  23.1234 -85.3456 
    A 2013-03-05 05:00:00  15.4565 32.1234 
     ...... 

    C 2013-03-01 19:55:00  44.4565 35.6783 
    C 2013-03-03 11:20:00  42.3121 -22.3456 
    C 2013-03-03 11:25:00  42.3121 -22.3456 
    C 2013-03-03 11:30:00  16.4565 22.1234 
    C 2013-03-03 11:50:00  42.3121 -22.3456 
    C 2013-03-03 11:55:00  19.4565 -25.1234 
     ...... 

時間戳是這樣的,每一行表示在5分鐘間隔期間的位置。這些數據爲期一週。

現在,我想要做的是獲得一個用戶每天在整個一週時間內在每個位置花費的時間的簡單分佈(直方圖)。因此,每個用戶每天在每個位置花費的時間爲0到24小時。

第二件事與上面的類似,但不考慮每天一個用戶的總時間,我只考慮連續時間花費。例如,對於用戶C,我會將第二條線和第三條線合併爲一個10分鐘的時間段,但是他回到同一地點的第五條線將是一個單獨的5分鐘時間段。

我該如何在Python中做到這一點?我在這裏是一個新手,有點卡在這裏。我猜想我可以將時間戳分成一天,一小時,幾分鐘和幾秒,每天都可以得到這些計數。但之後我迷路了。

+1

你有'numpy'和'matplotlib'包安裝? – unutbu 2013-03-21 14:52:25

+0

我會看看[pandas](http://pandas.pydata.org/)。 – root 2013-03-21 14:53:34

+0

是的。我安裝了大熊貓以及numpy和matplotlib。使用任何免費的庫不會是一個問題。學習如何使用它們是我需要學習的東西:) – sfactor 2013-03-21 14:54:40

回答

1

收集數據:

對於第一部分(這裏我們沒有「融合在一起的」時間戳),維持地圖

(latitude, longitude) -> time spent

過程中的每個時間戳,增加適當的地圖條目。

對於第二部分:

排序第一時間戳由用戶,然後通過時間。現在你可以在列表中運行兩個「指針」,一個用於開始,另一個用於連續期間的結束。

使用第三個「維度」增加您的地圖,該維度可以對應於連續期間的開始。

(latitude, longitude, beginning of period) -> time spent

而且,瞧,添加所有時間戳在連續期間到相應的映射條目。

可視化是一個不同的野獸:我不知道如何處理。

0

你可以做這樣的熱圖:

import numpy as np 
import pandas as pd 
import io 
import matplotlib.pyplot as plt 

content = '''\ 
    User  TimeStamp   Lat  Long 
    A 2013-03-01 19:55:00  45.4565 65.6783 
    A 2013-03-01 01:40:00  46.3121 -12.3456 
    A 2013-03-02 11:25:00  23.1234 -85.3456 
    A 2013-03-05 05:00:00  15.4565 32.1234 
    C 2013-03-01 19:55:00  44.4565 35.6783 
    C 2013-03-03 11:20:00  42.3121 -22.3456 
    C 2013-03-03 11:25:00  42.3121 -22.3456 
    C 2013-03-03 11:30:00  16.4565 22.1234 
    C 2013-03-03 11:50:00  42.3121 -22.3456 
    C 2013-03-03 11:55:00  19.4565 -25.1234 
''' 

df = pd.read_table(io.BytesIO(content), sep='\s+', parse_dates=True, index_col=[1]) 
fig, ax = plt.subplots(df['User'].nunique()) 
for i, (user, grp) in enumerate(df.groupby('User')): 
    xedges = np.linspace(grp['Long'].min(), grp['Long'].max(), 5) 
    yedges = np.linspace(grp['Lat'].min(), grp['Lat'].max(), 7)   
    hist, xedges, yedges = np.histogram2d(
     grp['Long'], grp['Lat'], (xedges, yedges), normed=False) 
    hist = hist.T 
    print(hist) 
    ax[i].pcolormesh(hist, cmap=plt.get_cmap('jet')) 
    ax[i].set_xticks(np.arange(hist.shape[1]+1), minor=False) 
    ax[i].set_xticklabels(map('{:0.2f}'.format, xedges), minor=False) 
    ax[i].set_yticks(np.arange(hist.shape[0]+1), minor=False) 
    ax[i].set_yticklabels(map('{:0.2f}'.format, yedges), minor=False) 
    ax[i].invert_yaxis() 
    ax[i].set_xlim(0, hist.shape[1]) 
    ax[i].set_ylim(0, hist.shape[0]) 
    ax[i].set_title(user) 
plt.show() 

enter image description here

相關問題