Python 通过插值引用数据
Python Referencing data by 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 好像挺麻烦的。
以下是如何插入您的值的示例。 coord_
和 ma_
数组将是您导入的数据。
脚本做的第一件事是从不同的一维数组构建一些更合理的数据结构。您实际要查找的部分是对 np.interp
、documented 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'])
我有两个数据集,其中一个有 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 好像挺麻烦的。
以下是如何插入您的值的示例。 coord_
和 ma_
数组将是您导入的数据。
脚本做的第一件事是从不同的一维数组构建一些更合理的数据结构。您实际要查找的部分是对 np.interp
、documented 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'])