2013-03-21 2 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-я строка, где он вернулся в том же месте, будет отдельным 5-минутным периодом.

Как бы это сделать в python? Я новичок здесь, и здесь я просто застрял. Я бы предположил, что я могу сломать временную метку в день, час, минуты и секунды, чтобы получить эти подсчеты в день. Но после этого я потерялся.

+1

У вас есть '' numpy' и matplotlib' установлены пакеты? – unutbu

+0

Я бы посмотрел на [панды] (http://pandas.pydata.org/). – root

+0

Да. У меня также установлены панды вместе с numpy и matplotlib. Использование любых свободно доступных библиотек не будет проблемой. Изучение того, как их использовать, - это то, что мне нужно изучить :) – sfactor

ответ

1

Чтобы собрать данные:

Для первой части (где мы не «сплавления» временные метки), сохранить карту

(latitude, longitude) -> time spent

процесса каждый временной метки, увеличивающиеся соответствующий запись на карте.

Для второй части:

Сортировка отметки времени первым пользователем, а затем по времени. Теперь вы можете запустить два «указателя» по списку, один для начала, а другой для конца непрерывного периода.

Увеличьте свою карту с помощью третьего «измерения», которое может соответствовать началу непрерывного периода.

т.е.

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

И, вуаля, добавьте все временные метки в немигающий период до соответствующей записи карты.

Визуализация - это другой зверь: один у меня нет понятия о том, как бороться.

0

Вы могли бы сделать Heatmap так:

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

Смежные вопросы