【问题标题】:how to synchronize or merge dataframe with json data based on timestamp如何根据时间戳将数据帧与json数据同步或合并
【发布时间】:2020-03-07 00:00:52
【问题描述】:

有很多关于如何合并两个熊猫数据框的例子,但我的问题是我有两种数据。 data1 是一个 csv 数据,我用 pandas 读取它并将其转换为数据帧,而另一个 data2 是 json 格式。

这里是一个json数据的例子:

[{'timestamp': 1572430625231, 'url': 'brakePressure', 'value': 10},
 {'timestamp': 1572430625275, 'url': 'lateralAcceleration', 'value': 120},
 {'timestamp': 1572430625290, 'url': 'longitudinalAcceleration', 'value': 110},
 {'timestamp': 1572430625299, 'url': 'acceleratorPosition', 'value': 1230},
 {'timestamp': 1572430625310, 'url': 'currentTorque', 'value': 10}]

如您所见,每个特征值都在带有时间戳的字典中。问题是如果我将其转换为数据帧,行将是时间戳、url 和值,但我不希望这样,我希望我的列(功能)将是刹车压力、横向加速等。在每一列中都有与该功能相对应且在此 json 中的所有值。

我的目标是根据时间戳合并两个数据集。这太难了,因为在 json 中,我有一个与每个特征值相关联的时间戳,相反,在 csv 数据中,我有一个对应于一行的时间戳(这意味着 n 个特征值而不是单个特征值)。我非常努力地做到这一点但没有机会,所以我想也许我可以搜索哪个是最接近的时间戳,然后一次替换一个值,这是我的尝试:

def sync_vehicle_gps_data(dataset=vehicle_data, gps_data=gps_data):
    vehicle = dataset.copy()
    gps = gps_data.copy()
    d = {}

    for json in vehicle:

        timestamp, feature, val = json.values()
        index = abs(gps['timestamp'] - timestamp).idxmin()
        print("closest value index = ", index)
        gps.at[index, feature] = val

    return gps

vehicle_data 是 json 数据,gps_data 是 pandas DataFrame,如您所见,我在整个数据集中搜索哪个时间戳最接近单个特征时间戳,然后更新该特定值,但这不起作用对我来说很好。我最终搞砸了数据。有没有办法在 python 中做到这一点?如果有的话,我也可以使用任何其他库,所以我不限于熊猫。

预期的输出是我可以将上面 json 中的这些值附加到现有数据帧中,这意味着在此示例中将添加新列“brakePressure”、“lateralAcceleraiton”等,并且每个特征的值(因为它在上面的 json 中,是的,它们是零,但这只是一个示例)将放在该行的时间戳最接近上面 json 中每个功能的时间戳键的时间戳的行中。我知道这是一个非常复杂的问题,很难解释,但我希望你明白我的意思。 这是一个例子:假设这是gps数据

      timestamp        X      Y     Z 
      1572430510880  595.00  179.00 -60.00
      1572430510890   -0.23   -0.09   0.01
      1572430510900   -0.11   -0.02   0.04
      1572430510910   -1.96   -5.19  -6.10

我想要这个输出(我只为一个特性展示这个):

      timestamp        X      Y        Z    brakePressure
      1572430510880  595.00  179.00 -60.00   10
      1572430510890   -0.23   -0.09   0.01   nan
      1572430510900   -0.11   -0.02   0.04   nan
      1572430510910   -1.96   -5.19  -6.10   nan

字典中的brakePressure 特征的值放在第一行,因为上面字典中与brakePressure 时间戳最接近的gps 时间戳也在第一行。基本上我想对 json 中的所有特征做同样的事情,我想将所有这些特征值与 gps 数据同步

【问题讨论】:

  • 你能发布一个期望输出的例子吗?
  • @naive 我更新了。我可以显示所需的输出,因为我没有。我没有实现它。我希望您能从我刚刚进行的编辑中理解我的意思
  • 你可以试试数据透视表。
  • @naive 我编辑了问题并展示了一个数据应该如何的示例。

标签: python json pandas dataframe merge


【解决方案1】:

参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html

您可以创建 0 和 1 作为列值:

import json

json_data = [{}, ]
df1 = pd.read_json(json.dumps(json_data))

给了

                timestamp                       url  value
0 2019-10-30 10:17:05.231             brakePressure     10
1 2019-10-30 10:17:05.275       lateralAcceleration    120
2 2019-10-30 10:17:05.290  longitudinalAcceleration    110
3 2019-10-30 10:17:05.299       acceleratorPosition   1230
4 2019-10-30 10:17:05.310             currentTorque     10

然后

ready_to_join_df = pd.get_dummies(df1, prefix="", prefix_sep="")

导致:

                timestamp  value  acceleratorPosition  brakePressure  currentTorque  lateralAcceleration  longitudinalAcceleration
0 2019-10-30 10:17:05.231     10                    0              1              0                    0                         0
1 2019-10-30 10:17:05.275    120                    0              0              0                    1                         0
2 2019-10-30 10:17:05.290    110                    0              0              0                    0                         1
3 2019-10-30 10:17:05.299   1230                    1              0              0                    0                         0
4 2019-10-30 10:17:05.310     10                    0              0              1                    0                         0

现在您可以在关键时间戳上加入两个数据帧。

【讨论】:

  • 问题是当我用 pandas 读取 json 时,我得到 3 列(对应于每个字典键),但我希望字典 url 值是列名。你明白我的意思了吗?我想你误解了这个问题。回顾一下我的 JSON 的样子。我无法使用 pd.read_json 将其转换为数据框,这会搞砸。如果我能找到一种方法将其转换为数据帧,那就太好了,但我不知道如何因为每个特征都有不同的时间戳,所以我不能在一行中堆叠特征值并给它们相同的时间戳值,因为它们有不同的时间戳
  • 您是否运行了pd.get_dummies(...,即最后一行指令?在加入之前,答案中的结果数据框是您想要的吗?
  • 您的代码将给出一个具有 3 列结果的数据框(时间戳列、url 列和一个值列),但我想要做的是完全不同的事情。我希望每一列都获取我在 json 中的 url 键的字典值
  • 我的代码会给你一个数据框,它不是 3 列,而是所有唯一的 urls 作为列。如果这不是您要查找的内容,则该问题可能无法解释正确的要求。
  • 谢谢你是对的对不起!我没想到会发生这种情况。好的,我现在如何加入他们?
猜你喜欢
  • 2019-06-22
  • 2016-03-23
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 2019-04-28
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多