基于时间序列合并两个张量的技术实现问询
按日期轴合并张量A2和B2的实现方案
核心思路
将两个张量对应的日期列表合并后按时间排序,根据排序后的日期顺序,从A2和B2中提取对应位置的数据,拼接成最终的张量C。
具体实现(PyTorch)
1. 预处理日期列表
先将字符串格式的日期转换为可排序的datetime对象,并标记每个日期的来源(A或B)及原索引:
import torch from datetime import datetime # 替换为你的真实日期列表 dates_A = ['2021-12-13', '2021-12-28', '2022-01-02', ...] # 长度19 dates_B = ['2021-12-20', '2022-01-05', ...] # 长度9 # 转换为datetime对象以便排序 date_objs_A = [datetime.strptime(d, "%Y-%m-%d") for d in dates_A] date_objs_B = [datetime.strptime(d, "%Y-%m-%d") for d in dates_B] # 合并所有日期项,记录来源和原索引 all_date_entries = [] for idx, dt in enumerate(date_objs_A): all_date_entries.append((dt, 'A', idx)) for idx, dt in enumerate(date_objs_B): all_date_entries.append((dt, 'B', idx)) # 按日期升序排序 all_date_entries.sort(key=lambda x: x[0])
2. 合并张量生成C
方式一:循环赋值(直观易读)
适合小批量数据,逻辑清晰:
# 初始化结果张量,匹配批次大小、合并后的长度和编码维度 batch_size = 128 encoded_dim = 10 C = torch.zeros(batch_size, len(all_date_entries), encoded_dim, dtype=A2.dtype, device=A2.device) # 按排序后的日期顺序填充数据 for merged_idx, (_, source, orig_idx) in enumerate(all_date_entries): if source == 'A': C[:, merged_idx, :] = A2[:, orig_idx, :] else: C[:, merged_idx, :] = B2[:, orig_idx, :]
方式二:向量化赋值(高效)
适合大规模张量,减少循环开销:
# 分离A和B的位置与索引 a_positions, a_indices = [], [] b_positions, b_indices = [], [] for merged_idx, (_, source, orig_idx) in enumerate(all_date_entries): if source == 'A': a_positions.append(merged_idx) a_indices.append(orig_idx) else: b_positions.append(merged_idx) b_indices.append(orig_idx) # 批量赋值 C = torch.zeros(batch_size, len(all_date_entries), encoded_dim, dtype=A2.dtype, device=A2.device) C[:, a_positions, :] = A2[:, a_indices, :] C[:, b_positions, :] = B2[:, b_indices, :]
注意事项
- 确保
dates_A长度等于A2的date轴长度(19),dates_B长度等于B2的date轴长度(9) - 若存在重复日期,上述代码会保留两个条目;如需合并重复日期,可先对
all_date_entries按日期分组,再自定义合并规则(如取A的data、取B的data或加权合并) - 日期格式需统一,若你的日期包含时间信息,需调整
strptime的格式字符串(例如"%Y-%m-%d %H:%M:%S")
内容的提问来源于stack exchange,提问作者Sasha
相关产品推荐
相关产品推荐

