对于nc文件的一些处理

提取全部变量,并且生成时间序列预测所需的数据

import numpy as np
import xarray as xr
data = xr.open_dataset('/data2/dataset/kc/My_project/data_stream-wave.nc')
for var in variables:
    # 只处理维度是 (744, 47, 51) 的变量,跳过其他维度不匹配的变量
    if data[var].shape == (744, 47, 51):
        data_vars.append(data[var].values)
# 假设你的数据是 data,形状为 [744, 47, 51]
data_combined = np.stack(data_vars, axis=-1) [744, 47, 51, 43]

# 用于生成时间序列预测数据
def create_time_series_multivar(data, input_length=12, pred_length=6, step=1):
    """
    生成用于时间序列预测的样本对,支持多变量输入
    data: 原始四维数据 (744, 47, 51, num_vars)
    input_length: 用于输入的时间步数 (例如:12)
    pred_length: 要预测的未来时间步数 (例如:6)
    step: 滑动窗口的步长
    """
    num_samples = (data.shape[0] - input_length - pred_length) // step + 1
    X = np.zeros((num_samples, input_length, data.shape[1], data.shape[2], data.shape[3]))
    y = np.zeros((num_samples, pred_length, data.shape[1], data.shape[2], data.shape[3]))
    
    for i in range(num_samples):
        X[i] = data[i*step:i*step + input_length, :, :, :]
        y[i] = data[i*step + input_length:i*step + input_length + pred_length, :, :, :]
        
    return X, y

# 生成多变量的时间序列数据
X, y = create_time_series_multivar(data_combined, input_length=12, pred_length=6, step=1)

# 输入数据形状: (727, 12, 47, 51, 43), 输出数据形状: (727, 6, 47, 51, 43)

找到对应变量的索引

import numpy as np

def find_variable_index(data, var_name):
    """
    根据变量名查找索引
    data: xarray Dataset
    var_name: 变量名(例如 'mwd')
    """
    # 获取所有变量的名字
    variables = list(data.data_vars)  # 获取所有变量的名字列表
    if var_name in variables:
        return variables.index(var_name)
    else:
        raise ValueError(f"变量 {var_name} 不存在于数据集中")

# 查找 mwd 的索引
mwd_index = find_variable_index(data, 'mwd')
print(f"mwd 的索引为: {mwd_index}")

构建合适的时间序列数据

def create_time_series_multivar(data, input_length=12, pred_length=6, step=1):
    """
    生成用于时间序列预测的样本对,支持多变量输入
    data: 原始四维数据 (744, 47, 51, num_vars)
    input_length: 用于输入的时间步数 (例如:12)
    pred_length: 要预测的未来时间步数 (例如:6)
    step: 滑动窗口的步长
    """
    data = data.sortby('valid_time')
    num_samples = (data['valid_time'].size - input_length - pred_length) // step + 1
    input_data = data.drop_vars('mwd')
    target_data = data['mwd'].values
    variables = list(input_data.data_vars)

# 遍历提取每个变量,并确保每个变量的形状为 (744, 47, 51)
    data_vars = []

    for var in variables:
    # 只处理维度是 (744, 47, 51) 的变量,跳过其他维度不匹配的变量
        if data[var].shape == (744, 47, 51):
            data_vars.append(data[var].values)
# 假设你的数据是 data,形状为 [744, 47, 51],data_combined(744, 47, 51, 43)
    data_combined = np.stack(data_vars, axis=-1)

    X = np.zeros((num_samples, input_length, data_combined.shape[1], data_combined.shape[2], data_combined.shape[3]))
    y = np.zeros((num_samples, pred_length, target_data.shape[1], target_data.shape[2]))
    
    for i in range(num_samples):
        X[i] = data_combined[i*step:i*step + input_length, :, :, :]
        y[i] = target_data[i*step + input_length:i*step + input_length + pred_length, :, :]
        
    return X, y
# 存在问题是,可能开始没有按照时间顺序排序

# 生成多变量的时间序列数据
X, y = create_time_series_multivar(data, input_length=12, pred_length=6, step=1)

# 查看生成的输入 X 和目标 y 的形状
print(f"输入数据形状: {X.shape}, 输出数据形状: {y.shape}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值