You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将非图像时序DataFrame转换为CNN所需的(60,90)输入格式?

将时间序列DataFrame转换为CNN输入格式的方法

针对你的需求——把含90个特征、每分钟采样的年度DataFrame,转换成(60,90,1)格式的连续时间窗口样本,这里提供两种高效实现方式:

方法一:Numpy手动构建滑动窗口(内存高效型)

适合需要直接获取numpy数组的场景,利用numpy的 stride_tricks 避免循环,大幅提升处理速度,且不额外占用内存(生成的是原数据的视图)。

import numpy as np
import pandas as pd

# 确保DataFrame已按时间排序(关键!)
df = df.sort_index()
# 转换为numpy数组,形状为(total_samples, 90)
data = df.values

window_size = 60
n_features = 90

# 计算滑动窗口的形状和步长
strides = (data.strides[0], data.strides[0], data.strides[1])
output_shape = (data.shape[0] - window_size + 1, window_size, n_features)

# 生成滑动窗口数组
windows = np.lib.stride_tricks.as_strided(data, shape=output_shape, strides=strides)

# 添加单通道维度,最终形状为(n_windows, 60, 90, 1)
windows = np.expand_dims(windows, axis=-1)

方法二:TensorFlow构建流式数据集(适合大型数据)

如果你的数据集过大(年度数据约50万+样本),一次性加载到内存压力大,推荐用TensorFlow的工具直接生成可分批的数据集,无缝对接模型训练。

import tensorflow as tf
import pandas as pd

# 确保DataFrame按时间排序
df = df.sort_index()
data = df.values

# 生成时间序列数据集,自动滑动窗口
dataset = tf.keras.utils.timeseries_dataset_from_array(
    data=data,
    targets=None,  # 若有标签可传入对应数组,无监督则留空
    sequence_length=60,
    sequence_stride=1,  # 每次滑动1分钟,可按需调整步长
    batch_size=32,  # 批次大小根据内存调整
)

# 添加单通道维度,每个样本形状变为(60,90,1)
dataset = dataset.map(lambda x: tf.expand_dims(x, axis=-1))

关键注意事项

  • 数据排序:必须确保DataFrame的时间索引是严格递增的,否则生成的窗口会包含乱序数据,可通过df.sort_index(inplace=True)修正。
  • 缺失值处理:提前清理或填充缺失值(如df.fillna(method='ffill')或df.dropna()),避免窗口中出现NaN影响模型训练。
  • 内存优化:若内存不足,优先选择TensorFlow的流式方法,无需一次性加载所有数据;使用Numpy方法时,可考虑分块处理或降低数据精度(如float32替代float64)。

内容的提问来源于stack exchange,提问作者fede72bari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:50:19