如何基于时间戳将数据帧与json数据同步或合并



关于如何合并两个panda数据帧,有很多例子,但我的问题是我有两种数据。data1是一个csv数据,我用panda读取它并将其转换为dataframe,另一个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和值,但我不希望这样,我希望我的列(功能(是brakePressure、lateralAcceleration等。在每一列中,都有与该功能相对应的所有值,这些值都在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中的这些值附加到现有的数据帧中,这意味着在本例中,将添加"lateralAcceleration"等,并将每个特性的值(如上面的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数据同步

参考: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

现在,您可以在密钥时间戳上连接两个数据帧。

最新更新