Как интерполировать широту / долготу и курс в Пандах - PullRequest
1 голос
/ 20 июня 2019

Описание: У меня есть кадр данных Pandas, образованный тремя столбцами: широта [-90; 90], долгота [-180; 180] и направление [0; 360]. Все столбцы в градусах. Индекс вместо этого формируется по дате + времени следующим образом:

df = pd.DataFrame({'lat':[87,90,85,10,-40,-85,-89,-40],
                   'lon':[-150,-178,176,100,10,1,-20,-100],
                   'dir':[180,200,356,4,20,1,351,20]},
                   index = pd.to_datetime(['2019-06-17 08:29:07','2019-06-17 08:29:11', '2019-06-17 08:29:16', '2019-06-17 08:29:25', '2019-06-17 08:29:33', '2019-06-17 08:29:40', '2019-06-17 08:29:48', '2019-06-17 08:29:57']))

Вот как это выглядит:

                     lat  lon  dir
2019-06-17 08:29:07   87 -150  180
2019-06-17 08:29:11   90 -178  200
2019-06-17 08:29:16   85  176  356
2019-06-17 08:29:25   10  100    4
2019-06-17 08:29:33  -40   10   20
2019-06-17 08:29:40  -85    1    1
2019-06-17 08:29:48  -89  -20  351
2019-06-17 08:29:57  -40 -100   20

ЦЕЛЬ: Моя цель состоит в том, чтобы добавить отсутствующие значения времени между индексами и выполнить интерполяцию (ex linear) между отсутствующими координатами и углами. Я смог добавить отсутствующие даты, например, так:

idx = pd.to_datetime(pd.date_range(df.index[0], df.index[-1], freq='s').strftime('%Y-%m-%d %H:%M:%S'))
df  = df.reindex(idx, fill_value='NaN')

                     lat   lon  dir
2019-06-17 08:29:07   87  -150  180
2019-06-17 08:29:08  NaN   NaN  NaN
2019-06-17 08:29:09  NaN   NaN  NaN
2019-06-17 08:29:10  NaN   NaN  NaN
2019-06-17 08:29:11   90  -178  200
2019-06-17 08:29:12  NaN   NaN  NaN
2019-06-17 08:29:13  NaN   NaN  NaN
...................  ...   ...  ...
2019-06-17 08:29:55  NaN   NaN  NaN
2019-06-17 08:29:56  NaN   NaN  NaN
2019-06-17 08:29:57  -40  -100   20

Чтобы достичь своей цели, я безуспешно пытался использовать функцию панд pandas.Series.interpolate, поскольку она не учитывает угол «скачков» между -180; 180 для долготы и «скачок» между 360 и 0. для направления.

ВОПРОС: Не могли бы вы предоставить умный и элегантный способ добиться такой интерполяции, чтобы он учитывал эти скачки между пределами их диапазона?

Примечание: здесь есть пример, чтобы быть более ясным (интерполяция между -176 и 176): -176, -177, -178, -179, -180 / 180,179,178,177,176?

1 Ответ

0 голосов
/ 20 июня 2019

Здесь есть ответ на мой вопрос:

df.reset_index(drop=False, inplace=True)
df['dir'] = np.rad2deg(np.unwrap(np.deg2rad(df['dir'])))
df['lat'] = np.rad2deg(np.unwrap(np.deg2rad(df['lat'])))
df['lon'] = np.rad2deg(np.unwrap(np.deg2rad(df['lon'])))
df = pd.merge(left=idx, right=df, on='index', how='left').interpolate()
df[['lat','lon','dir']] %= 360
print(df)
...