用Python创建用户轨迹

时间:2017-03-31 01:23:10

标签: python sorting gps gis

我需要一些帮助在python中创建轨迹。我有一个包含user_ids,时间戳,纬度和经度的CSV。我想在我的文件中创建第5列(或者一起写入新文件),其中包含每个user_id的轨迹,这需要按用户对坐标进行分组,并按时间戳排序(升序)。我能够在PostGIS中完成,但结果是几何,我需要的是坐标系。我已经尝试过使用集合和itertools以及Pandas来进行分组和排序,但我正在努力。

供参考,以下是我的数据行:

user_id, timestamp, latitude, longitude
478134225, 3/12/2017 9:04, 38.8940974, -77.0276216
478103585, 3/12/2017 9:04, 38.882584, -77.1124701
478073193, 3/12/2017 9:07, 39.00027849, -77.09480086
476194185, 3/12/2017 9:14, 38.8048355, -77.0469214
476162349, 3/12/2017 9:16, 38.8940974, -77.0276216
478073193, 3/12/2017 9:05, 38.8549, -76.8752
477899275, 3/12/2017 9:08, 38.90181532, -77.03733586
477452890, 3/12/2017 9:08, 38.96117237, -76.95561893
478073193, 3/12/2017 9:05, 38.7188716, -77.1542684

正如您所看到的,有些用户有多个条目,所以我需要按他们分组并按时间排序坐标。例如。类似于下面的东西

478073193 (38.8549,-76.8752)(38.7188716,-77.1542684)(39.00027849,-77.09480086)

我有超过150k的积分,所以像我上面那样手工做是不可取的。

1 个答案:

答案 0 :(得分:2)

这应该这样做。它使用流行的熊猫包和numpy。

import pandas as pd
import numpy as np

# First we import the data
data = pd.read_csv('data.csv', delimiter=', ')

# Now get a list of unique user_id values
uniqueIds = np.unique(data['user_id'].values)

# Now just get the ordered (by timestamp) coordinates for each user_id
output = [[id,data.loc[data['user_id']==id].sort_values(by='timestamp')[['latitude','longitude']].values.tolist()] for id in uniqueIds]

输出是一个列表,其中包含[id,list_of_paired_coordinates]形式的每个元素,例如:

[[476162349, [[38.8940974, -77.02762159999999]]],
 [478073193, [[38.8549, -76.8752],
              [38.7188716, -77.1542684],
              [39.00027849, -77.09480086]]],
 [478103585, [[38.882584, -77.11247009999998]]],
 [478134225, [[38.8940974, -77.02762159999999]]]]

修改

如果您想以JSON格式保存输出,可以执行以下操作:

import json

# Now turn our array into a dict {id:coordinates}
outputDict = {}
for i in output:
    outputDict[i[0]]=i[1]

with open('output.json', 'w') as f:
    json.dump(outputDict, f, sort_keys=True, indent=4, ensure_ascii=False, separators=(',',':'))

根据您对输出文件格式的格式化,您可能需要稍微修改 outputDict 的结构(如果是这种情况,请告诉我)。现在JSON文件看起来像:

{
    "476162349":[
        [
            38.8940974,
            -77.02762159999999
        ]
    ],
    "476194185":[
        [
            38.804835499999996,
            -77.0469214
        ]
    ....

编辑2

如果要格式化输出JSON文件,可以为dict中存储的值添加标签:

outputDict = {}
for i in output:
    coords={}
    latList=[]
    longList=[]
    for j in i[1]:
    latList.append(j[0])
    longList.append(j[1])
    coords["latitude"]=latList
    coords["longitude"]=longList
    outputDict[i[0]]=coords

输出JSON文件看起来像这样:

{
    "476162349":{
        "latitude":[
            38.8940974
        ],
        "longitude":[
            -77.02762159999999
        ]
    },
    "476194185":{
        "latitude":[
            38.804835499999996
        ],
        "longitude":[
            -77.0469214
        ]
    }
        ....