如何不使用聚合函数执行Pivot,将value列转成Timestamp与Value列?
解决思路与实现代码
你的核心问题是缺少分组标识,导致Pivot时所有行被归为同一组,只能得到聚合后的单行结果。下面提供三种实用的解决方法,以Python Pandas为例:
方法一:添加分组序号后Pivot
通过给每一对(t, v)行添加唯一组ID,让Pivot能识别独立的时间-数值对,避免不必要的聚合:
import pandas as pd # 假设你的原始数据已存入DataFrame df df['group_id'] = (df['key'] == 't').cumsum() # 每遇到't'就生成新组号 # 执行Pivot并整理结果 result = df.pivot( index=['Area', 'Sensor', 'Type', 'group_id'], columns='key', values='value' ).reset_index() # 重命名列并清理临时列 result = result.rename(columns={'t': 'Timestamp', 'v': 'Value'}).drop(columns='group_id') # 转换数据类型(可选,根据需求调整) result['Timestamp'] = pd.to_datetime(result['Timestamp']) result['Value'] = pd.to_numeric(result['Value'])
方法二:利用行顺序直接拼接
观察到t(时间)和v(数值)是交替出现的,直接筛选两类行后拼接:
# 分离时间行和数值行 time_rows = df[df['key'] == 't'].reset_index(drop=True) value_rows = df[df['key'] == 'v']['value'].reset_index(drop=True) # 合并数据并整理列 result = time_rows.drop(columns=['key', 'value']).assign( Timestamp=time_rows['value'], Value=value_rows ) # 转换数据类型 result['Timestamp'] = pd.to_datetime(result['Timestamp']) result['Value'] = pd.to_numeric(result['Value'])
方法三:分组后批量整理
如果数据存在多组Area/Sensor/Type,按分组批量提取时间和数值列表后重组:
def reshape_single_group(group): timestamps = group[group['key'] == 't']['value'].tolist() values = group[group['key'] == 'v']['value'].tolist() return pd.DataFrame({ 'Area': [group['Area'].iloc[0]] * len(timestamps), 'Sensor': [group['Sensor'].iloc[0]] * len(timestamps), 'Type': [group['Type'].iloc[0]] * len(timestamps), 'Timestamp': timestamps, 'Value': values }) # 按分组处理并合并结果 result = df.groupby(['Area', 'Sensor', 'Type']).apply(reshape_single_group).reset_index(drop=True) # 转换数据类型 result['Timestamp'] = pd.to_datetime(result['Timestamp']) result['Value'] = pd.to_numeric(result['Value'])
最终效果
处理后的结果会将每一对时间和数值合并为一行,保留Area、Sensor、Type列,生成Timestamp和Value列,示例结果如下:
| Area | Sensor | Type | Timestamp | Value |
|---|---|---|---|---|
| 1 | termometer | Temperature | 2022-01-01 00:00:01.003000 | 24 |
| 1 | termometer | Temperature | 2022-01-01 00:00:02.876000 | 25 |
| ... | ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者Urumita
相关产品推荐
相关产品推荐

