как синхронизировать или объединить фрейм данных с данными json на основе метки времени - PullRequest
0 голосов
/ 11 ноября 2019

Есть много примеров того, как объединить два кадра данных панд, но моя проблема в том, что у меня есть два вида данных. data1 - это данные в формате csv, которые я читаю с помощью панд и превращаю в dataframe, а другие данные2 в формате 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

Данные json и gps_data - это DataFrame от pandas. Как вы можете видеть, я ищу по всему набору данных, какая временная метка ближе всего к временной метке одного объекта, а затем я обновляю это конкретное значение, но это не сработало для меня. В итоге я испортил данные. Есть ли способ сделать это в 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функция в словаре была помещена в первую строку, потому что ближайшая метка времени gps к метке времени brakePressure в словаре выше также находится в первой строке. По сути, я хочу сделать то же самое для всех функций в json, я хочу синхронизировать все эти значения функций с данными gps

1 Ответ

1 голос
/ 11 ноября 2019

Ref: 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

И теперь вы можете объединить два кадра данных на ключевой отметке времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...