Объединить 2 массива с временными метками - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть два нудистых ndarrays - каждый со своим собственным измерением времени.Я хочу объединить их вместе.Однако интервал их временных отметок не обязательно совпадает.Вот пример того, что я имею в виду:

Array 1: names =  ['timestamp', 'value']
a1 = [(1531000000, 0), (1532000000, 1), (1533000000, 2), (1534000000, 3)]

Array 2: names =  ['timestamp', 'color']
a2 = [(1531500000, "blue"), (1532000000, "black"), (1533500000, "green"), (1534000000, "red")]

Resulting Array: names =  ['timestamp', 'value', 'color']
a3 = [(1531000000, 0, nan), (1531500000, nan, "blue"), (1532000000, 1, "black"), (1533000000, 2, nan), (1533500000, nan, "green"), (1534000000, 3, "red")]

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Настройка

Это выглядит , как будто вы показываете здесь структурированные массивы, поэтому я предполагаю, что вы их используете.Если вы не используете структурированные массивы, вы должны, в этом случае вы можете создать их следующим образом:

a1 = np.array(a1, dtype=[('timestamp', int), ('value', int)])
a2 = np.array(a2, dtype=[('timestamp', int), ('color', '<U5')])

Теперь вы можете использовать numpy.lib.recfunctionsздесь:

import numpy.lib.recfunctions as recfunctions

out = recfunctions.join_by('timestamp', a1, a2, jointype='outer')

masked_array(data=[(1531000000, 0, --), (1531500000, --, 'blue'),
                   (1532000000, 1, 'black'), (1533000000, 2, --),
                   (1533500000, --, 'green'), (1534000000, 3, 'red')],
             mask=[(False, False,  True), (False,  True, False),
                   (False, False, False), (False, False,  True),
                   (False,  True, False), (False, False, False)],
       fill_value=(999999, 999999, 'N/A'),
            dtype=[('timestamp', '<i4'), ('value', '<i4'), ('color', '<U5')])

Вывод выглядит немного запутанным, но это просто, как выглядит представление np.ma.masked_array.Легко видеть, что это правильный вывод:

out.tolist()

[(1531000000, 0, None),
 (1531500000, None, 'blue'),
 (1532000000, 1, 'black'),
 (1533000000, 2, None),
 (1533500000, None, 'green'),
 (1534000000, 3, 'red')]

Однако, с замаскированным массивом, у вас есть доступ ко всему множеству служебных функций, чтобы правильно заполнитьпропущенные значения.

0 голосов
/ 27 сентября 2018

С помощью Pandas вы можете выполнить внешнее слияние, а затем отсортировать.Это естественно, поскольку в платформе Pandas используются массивы NumPy.

import pandas as pd

res = pd.merge(df1, df2, how='outer').sort_values('timestamp').values.tolist()

Результат

[[1531000000, 0.0, nan],
 [1531500000, nan, 'blue'],
 [1532000000, 1.0, 'black'],
 [1533000000, 2.0, nan],
 [1533500000, nan, 'green'],
 [1534000000, 3.0, 'red']]

Настройка

names =  ['timestamp', 'value']
a1 = [(1531000000, 0), (1532000000, 1), (1533000000, 2), (1534000000, 3)]
df1 = pd.DataFrame(a1, columns=names)

names =  ['timestamp', 'color']
a2 = [(1531500000, "blue"), (1532000000, "black"), (1533500000, "green"), (1534000000, "red")]
df2 = pd.DataFrame(a2, columns=names)
...