Python通过插值引用数据

时间:2018-07-02 04:41:03

标签: python datetime interpolation

我有两个数据集,其中一个具有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 :(得分:1)

以下是如何内插值的示例。 coord_ma_数组将是您导入的数据。

脚本执行的第一件事是从不同的一维数组构建一些更明智的数据结构。您真正要查找的部分是对np.interpdocumented here的调用。

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'])