【问题标题】:2D interpolation with datetime format X values具有日期时间格式 X 值的 2D 插值
【发布时间】:2018-05-14 08:54:05
【问题描述】:

我有一个这样的数据框:

import pandas as pd
import numpy as np

time = pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='5T')
mile = np.linspace(0,100,10)
x = list(time)*len(mile)
y = np.repeat(mile,len(time))
z = []
for i in range(0,10,1):
    z.extend(np.random.normal(loc=i*5, scale=5, size=13))
origin_data = pd.DataFrame({'x':x, 'y':y ,'z':z})

origin_data 包含原始点的位置(x 和 y)及其值(z)。我想在这些 新位置 处插入 z 值:x = pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='1T')y = np.linspace(0,91,1) 仅使用双线性插值。

我了解了关于scipy.interpolate.interp2d的官方文档。但它的 x 类型是数字,我的是日期时间。此外,本教程的z 值是计算的,而我的值已经给出,所以我不知道如何处理输入z 值的顺序。谁能给我一个示例,其中包含基于我上面提供的数据框的插值结果图?感谢您的关注!

【问题讨论】:

    标签: python datetime scipy interpolation


    【解决方案1】:

    这是我发现这个问题的方式:

    import pandas as pd
    import numpy as np
    from scipy import interpolate
    import itertools
    
    
    time = pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='5T')
    mile = np.arange(0,100,10)
    x = list(time)*len(mile)
    y = np.repeat(mile,len(time))
    z = []
    
    
    for i in range(0,10,1):
        z.extend(np.random.normal(loc=i*5, scale=5, size=13))
    origin_data = pd.DataFrame({'x':x, 'y':y ,'z':z})
    
    from ggplot import *
    
    ggplot(aes(x = 'x', y = 'y', colour = 'z'), data = origin_data) +\
        geom_point(size = 100) +\
        scale_x_date(labels = date_format("%Y-%m-%d %H:%M:S"))
    
    
    x_numeric = [x.timestamp() for x in origin_data['x']]
    
    
    
    x_cors = pd.unique(x_numeric)
    y_cors = pd.unique(origin_data['y'])
    
    cors = list(itertools.product(x_cors,y_cors))
    
    interp_func = interpolate.LinearNDInterpolator(cors, z)
    interp_func = interpolate.CloughTocher2DInterpolator(cors, z)
    
    new_x = [x.timestamp() for x in pd.date_range('2018-05-14 00:00:00','2018-05-14 01:00:00',freq='1T')]
    new_y = np.arange(0,91,1)
    
    new_cors = list(itertools.product(new_x,new_y))
    
    new_z = interp_func(new_cors)
    
    
    new_data = pd.DataFrame({'x':[x[0] for x in new_cors],
                             'y':[x[1] for x in new_cors],
                             'z':new_z})
    
    import datetime
    
    new_data['x'] = [pd.Timestamp(x,unit = 's') for x in new_data['x']]
    
    ggplot(aes(x='x',y='y',colour='z'),data=new_data) +\
        geom_point(size=100) +\
        scale_x_date(labels = date_format("%Y-%m-%d %H:%M:S"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多