我有一个大数据文件,其中包含一些用户的位置信息。格式如下所示:
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分钟间隔期间的位置。该数据为期一周。
现在,我想要做的是获得一个用户每天在每个位置花费的时间在整个一周内的简单分布(直方图)。因此,每个用户每天在每个位置花费的时间为0h到24h。
第二件事情与上面的情况相似,但不考虑每天一个用户的总时间,我只会考虑连续的时间花费。例如,对于用户C,我会将第2行和第3行视为10分钟,但是他回到同一位置的第5行将是一个单独的5分钟。
我如何在python中执行此操作?我是这里的新手,有点被困在这里。我猜我可以将时间戳分解为每天,每小时,每分钟和几秒钟来确定每天的这些数量。但在那之后我迷失了。
答案 0 :(得分:1)
收集数据:
对于第一部分(我们不是“融合在一起”的时间戳),维护一张
的地图 (latitude, longitude) -> time spent
处理每个时间戳,增加相应的地图条目。
第二部分:
首先按用户排序时间戳,然后按时间排序。现在你可以在列表中运行两个“指针”,一个用于开头,另一个用于连续一段时间。
使用第三个“维度”扩充您的地图,这可能对应于连续期的开始。
即
(latitude, longitude, beginning of period) -> time spent
并且,瞧,将连续时间段内的所有时间戳添加到相应的地图条目中。
可视化是一种不同的野兽:我不知道如何处理。
答案 1 :(得分: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()