0

我有一个包含一些用户位置信息的大数据文件。格式如下图:

   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,我会将第 2 行和第 3 行一起视为 10 分钟的时间段,但他回到同一个地方的第 5 行将是单独的 5 分钟时间段。

我将如何在 python 中执行此操作?我是这里的新手,有点卡在这里。我想我可以把时间戳分成天、小时、分钟和秒,每天都会得到这些计数。但在那之后我迷路了。

4

2 回答 2

1

要收集数据:

对于第一部分(我们没有将时间戳“融合在一起”),维护一张

(latitude, longitude) -> time spent

处理每个时间戳,增加相应的映射条目。

对于第二部分:

首先按用户对时间戳进行排序,然后按时间排序。现在您可以在列表中运行两个“指针”,一个用于开始,另一个用于连续周期的结束。

用第三个“维度”扩充您的地图,这可能对应于连续周期的开始。

IE

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

而且,瞧,将连续期间的所有时间戳添加到适当的映射条目。

可视化是另一种野兽:我不知道如何处理它。

于 2013-03-21T15:02:48.033 回答
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()

在此处输入图像描述

于 2013-03-21T19:04:45.657 回答