Python Ссылка на данные путем интерполяции - PullRequest
0 голосов
/ 02 июля 2018

У меня есть два набора данных, один из которых имеет массив времени в форме datetime.datetime, а массив координат x, y, z того времени, например, time[0]=datetime.datetime(2000,1,21,0,7,25), x[0]=-6.7, etc.

Я бы хотел вычислить что-то из координат, но для этого нужен другой параметр (Ma), который зависит от времени. Второй набор данных имеет другой массив времени в той же форме даты и времени, а параметр записывается в это время, например time[0]=datetime.datetime(2000,1,1,0,3), Ma[0]=2.73

Проблема в том, что временной массив из двух наборов данных отличается (хотя диапазоны похожи)

Итак, я хочу интерполировать значение параметра в каждый момент времени для набора данных 1, например Ma[0], но 0 не является индексом времени набора данных 2, но соответствует индексу набора данных 1. Как я могу это сделать?

PS. Могу ли я преобразовать форму времени в более простую? datetime.datetime кажется довольно громоздким.

1 Ответ

0 голосов
/ 05 июля 2018

Ниже приведен пример того, как интерполировать ваши значения. Массивы coord_ и ma_ будут вашими импортированными данными.

Первое, что делает скрипт, это создает более разумные структуры данных из ваших разнородных одномерных массивов. Часть, которую вы на самом деле ищете, это вызов np.interp, , задокументированный здесь .

import numpy as np
import datetime
import time

# Numpy cannot interpolate between datetimes
# This function converts a datetime to a timestamp
def to_ts(dt):
    return time.mktime(dt.timetuple())

coord_dts = np.array([
    datetime.datetime(2000, 1, 1, 12),
    datetime.datetime(2000, 1, 2, 12),
    datetime.datetime(2000, 1, 3, 12),
    datetime.datetime(2000, 1, 4, 12)
])

coord_xs = np.array([3, 5, 8, 13])
coord_ys = np.array([2, 3, 5, 7])
coord_zs = np.array([1, 3, 6, 10])

ma_dts = np.array([
    datetime.datetime(2000, 1, 1),
    datetime.datetime(2000, 1, 2),
    datetime.datetime(2000, 1, 3),
    datetime.datetime(2000, 1, 4)
])

ma_vals = np.array([1, 2, 3, 4])

# Handling the data as separate arrays will be painful.
# This builds an array of dictionaries with the form:
#   [ { 'time': timestamp, 'x': x coordinate, 'y': y coordinate, 'z': z coordinate }, ... ]
coords = np.array([
    { 'time': to_ts(coord_dts[idx]), 'x': coord_xs[idx], 'y': coord_ys[idx], 'z': coord_zs[idx] }
    for idx, _ in enumerate(coord_dts)
])

# Build array of timestamps from ma datetimes
ma_ts = [ to_ts(dt) for dt in ma_dts ]

for coord in coords:
    print("ma interpolated value", np.interp(coord['time'], ma_ts, ma_vals))
    print("at coordinates:", coord['x'], coord['y'], coord['z'])
...