合并DataFrame中多个Timestamp列至单列并匹配对应数值
问题描述
我有一个包含70个以_Timestamp结尾的列的DataFrame,同时包含对应的数值列(例如A_Timestamp对应B_Values、BC_Timestamp对应C_Values等)。示例数据结构如下:
原始数据示例
- 含
A_Timestamp与B_Values的子集:
| A_Timestamp | B_Values |
|---|---|
| 2020-11-08 11:15:00 | 1 |
| 2020-11-10 15:34:00 | 2 |
- 含
BC_Timestamp与C_Values的子集:
| BC_Timestamp | C_Values |
|---|---|
| 2020-11-11 12:13:00 | 8 |
| 2020-11-15 02:47:00 | 4 |
- 含
DA_Timestamp与D_Values的子集:
| DA_Timestamp | D_Values |
|---|---|
| 2020-1-13 14:47:00 | 3 |
| 2020-11-9 5:34:00 | 5 |
- 含
CA_Timestamp与Q_Values的子集:
| CA_Timestamp | Q_Values |
|---|---|
| 2020-7-18 01:04:00 | 7 |
| 2020-04-10 16:34:00 | 6 |
期望输出
需要将所有_Timestamp列合并为单个Timestamp列,每个时间戳对应填充其关联的数值列,其余数值列填充NaN,最终格式如下:
| Timestamp | B_Values | C_Values | D_Values | Q_Values |
|---|---|---|---|---|
| 2020-11-08 11:15:00 | 1 | NaN | NaN | NaN |
| 2020-11-10 15:34:00 | 2 | NaN | NaN | NaN |
| 2020-11-11 12:13:00 | NaN | 8 | NaN | NaN |
| 2020-11-15 02:47:00 | NaN | 4 | NaN | NaN |
| 2020-1-13 14:47:00 | NaN | NaN | 3 | NaN |
| 2020-11-9 05:34:00 | NaN | NaN | 5 | NaN |
| 2020-7-18 01:04:00 | NaN | NaN | NaN | 7 |
| 2020-04-10 16:34:00 | NaN | NaN | NaN | 6 |
解决方案
可以通过以下步骤实现需求,代码支持扩展到70组Timestamp-数值列的场景:
import pandas as pd # 1. 构造原始DataFrame(实际使用时替换为你的真实数据) df = pd.DataFrame({ 'A_Timestamp': ['2020-11-08 11:15:00', '2020-11-10 15:34:00', None, None, None, None, None, None], 'BC_Timestamp': [None, None, '2020-11-11 12:13:00', '2020-11-15 02:47:00', None, None, None, None], 'DA_Timestamp': [None, None, None, None, '2020-1-13 14:47:00', '2020-11-9 5:34:00', None, None], 'CA_Timestamp': [None, None, None, None, None, None, '2020-7-18 01:04:00', '2020-04-10 16:34:00'], 'B_Values': [1, 2, None, None, None, None, None, None], 'C_Values': [None, None, 8, 4, None, None, None, None], 'D_Values': [None, None, None, None, 3, 5, None, None], 'Q_Values': [None, None, None, None, None, None, 7, 6] }) # 2. 定义Timestamp列与对应数值列的映射(70组的话可以批量生成,比如通过列名前缀匹配) # 示例映射,实际可根据你的列名规则自动生成 timestamp_value_map = { 'A_Timestamp': 'B_Values', 'BC_Timestamp': 'C_Values', 'DA_Timestamp': 'D_Values', 'CA_Timestamp': 'Q_Values' } # 3. 遍历映射,生成每个Timestamp-数值列的临时DataFrame temp_dfs = [] for ts_col, val_col in timestamp_value_map.items(): # 过滤掉Timestamp为空的行,重命名Timestamp列为统一名称 subset = df[[ts_col, val_col]].dropna(subset=[ts_col]) subset.rename(columns={ts_col: 'Timestamp'}, inplace=True) temp_dfs.append(subset) # 4. 合并所有临时DataFrame,填充缺失的数值列为NaN result = pd.concat(temp_dfs, ignore_index=True) # 确保所有数值列都存在于结果中 all_value_cols = list(timestamp_value_map.values()) for col in all_value_cols: if col not in result.columns: result[col] = pd.NA # 5. 可选:将Timestamp转为datetime类型并排序 result['Timestamp'] = pd.to_datetime(result['Timestamp']) result = result.sort_values('Timestamp').reset_index(drop=True) print(result)
代码说明
- 批量映射生成:如果你的70组列有统一命名规则(比如
X_Timestamp对应X_Values),可以用代码自动生成映射,无需手动输入:timestamp_cols = [col for col in df.columns if col.endswith('_Timestamp')] # 根据实际列名规则调整映射逻辑 timestamp_value_map = {col: col.replace('_Timestamp', '_Values') for col in timestamp_cols} - 合并逻辑:通过拆分每个Timestamp-数值列对,过滤空值后合并,确保每个时间戳只对应其关联的数值,其余自动填充
NaN。 - 排序处理:将
Timestamp转为datetime类型后排序,让结果更规整。
内容的提问来源于stack exchange,提问作者Nilay
相关产品推荐
相关产品推荐

