python中的时空插值

时间:2019-06-03 15:06:35

标签: python interpolation spatial temporal

我是使用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 个答案:

答案 0 :(得分:1)

处理时间插值的最好方法是将时间转换成过去从参考点开始的总秒数。然后,您可以插值所有值,就好像它们是浮点数一样。

这是您的输入数据框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和seconds列进行插值(请注意,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))