如何将此JSON转换为Pandas中更易处理的结构

时间:2014-03-11 01:31:12

标签: json pandas dataframe

我有一堆代表自行车骑行活动的json文件(来自Strava网站API)。

当我用pandas.io.json.read_json(filenme)打开文件时,我得到了这个结果

"Printing DataFrame:"
Data columns (total 11 columns):
altitude           33286  non-null values
distance           33286  non-null values
grade_smooth       33286  non-null values
latlng             33286  non-null values
moving             33286  non-null values
outlier            33286  non-null values
resting            33286  non-null values
time               33286  non-null values
total_elevation    33286  non-null values
velocity_smooth    33286  non-null values
watts_calc         33286  non-null values
dtypes: bool(3), float64(5), int64(2), object(1)

"printing single row (df.ix[0]):"
altitude                              699.2
distance                                  0
grade_smooth                              9
latlng             [-28.234746, -52.380721]
moving                                False
outlier                               False
resting                               False
time                                      0
total_elevation                           0
velocity_smooth                           0
watts_calc                                0
Name: 0, dtype: object

但是,我想进行两项重要修改以增强我的工作流程:

  1. 在名为“lat”和“lon”的两个object列中拆分latlng(目前读作float64类型);
  2. 转换“time” - 表示从开始时间开始经过的第二个 - 以datetime64数据类型,并使其成为索引。在另一个脚本中,我使用[start_time + datetime.timedelta(seconds = t) for t in json_activity['time']];
  3. 执行此操作
  4. 只选择一些列(时间,海拔高度,纬度,经度,距离),而不考虑其他列。
  5. 我看了一下这些文档,但它们和我上一次尝试使用熊猫一年前一样令人困惑......

    编辑:我有以下代码可以提供我想要的内容,但对我来说有点恶意:

    activity = json.load(open(fname))
    
    datetimestring = fname.split(' - ')[0]  # start time is taken from filename
    start = datetime.datetime.strptime(datetimestring, '%Y-%m-%d-%H-%M-%S')
    time = numpy.array([start + datetime.timedelta(seconds = t) for t in activity['time']])
    
    lat,lon = numpy.hsplit(numpy.array(activity['latlng'], dtype=float), 2)
    
    dist = numpy.array(activity['distance'], dtype=float)/1000.0
    
    speed = numpy.array(activity['velocity_smooth'], dtype=float)
    
    df = pandas.DataFrame({'dist': dist,
                           'lat': lat.ravel(),
                           'lon': lon.ravel()},
                           index=time)
    
    df.sort_index(inplace=True)
    

0 个答案:

没有答案