пространственно-временная интерполяция в питоне - PullRequest
0 голосов
/ 03 июня 2019

Я новичок в использовании Python, поэтому мне нужна помощь.

У меня есть данные в двух DataFrame в четырех столбцах: широта, долгота, дата-время и температура.

В DataFrame df2 у меня есть широта, долгота, дата и время, и мне нужно интерполировать температуру, используя данные из df1.

Мне нужно использовать координаты и дату и время для интерполяции, и я не знаю, как это сделать.

Пример DataFrame:

df1:

lat     |    lon   |      Datetime         | temp
---------------------------------------------------
15.13   |  38.52   |  2019-03-09 16:05:07  |   23

12.14   |  37.536  |  2019-03-15 09:50:07  |   22

13.215  |  39.86   |  2019-03-09 11:03:47  |   21

11.1214 |  38.536  |  2019-03-10 16:41:18  |   22

12.14   |  37.536  |  2019-03-09 06:15:27  |   19

df2:

lat     |     lon    |     Datetime           
---------------------------------------------
13.13   |   38.82    |   2019-03-06 04:05:07    
11.14   |   36.36152 |  2019-03-15 19:51:07      
10.214  |   39.123   |   2019-03-19 11:01:08    
12.14   |   37.536   |   2019-03-10 16:15:27    

Какой метод или функцию мне нужно использовать?

1 Ответ

1 голос
/ 03 июня 2019

Лучший способ справиться с временной интерполяцией - преобразовать время в общее количество секунд из контрольной точки в прошлом. Затем вы можете интерполировать все значения, как если бы они были числами с плавающей запятой.

Вот ваши входные кадры данных df1 и df2:

df1 = pd.DataFrame({'lat':[15.13,12.14,13.215,11.1214,12.14], 
              'lon': [38.52, 37.536,39.86,38.536,37.536],
              'Datetime': pd.to_datetime(['2019-03-09 16:05:07','2019-03-15 09:50:07','2019-03-09 11:03:47','2019-03-10 16:41:18','2019-03-09 06:15:27']),
              'temp':[23,22,21,22,19]})


df2 = pd.DataFrame({'lat':[13.13,11.14,10.214,12.14], 
              'lon': [38.82, 36.36152,39.123,37.536],
              'Datetime': pd.to_datetime(['2019-03-06 04:05:07 ','2019-03-15 19:51:07','2019-03-19 11:01:08','2019-03-10 16:15:27'])})

Вот как можно преобразовать время в числа с плавающей запятой, основываясь на секундах от контрольной точки в прошлом:

df1['seconds'] = df1.Datetime.apply(lambda x: (pd.to_datetime(x)-pd.to_datetime('2019-03-01 00:00:00')).total_seconds())
df2['seconds'] = df2.Datetime.apply(lambda x: (pd.to_datetime(x)-pd.to_datetime('2019-03-01 00:00:00')).total_seconds())

И, наконец, вы можете использовать функцию интерполяции из scipy или любого другого пакета для интерполяции, используя столбцы lat, lon и секунд (обратите внимание, что некоторые из ваших точек в df2 выходят за пределы диапазона, определенного в df1, и вы получаете nans как результат):

from scipy.interpolate import griddata

griddata((df1.loc[:,['lat','lon','seconds']].values),
         df1.iloc[:,3].values,
         (df2.iloc[:,[0,1,3]].values))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...