如何修正CSV数据集时间并将Name列透视为独立列?
解决CSV数据时间修正+透视转换的问题
嘿,我来帮你搞定这个需求!你已经找对了用pd.pivot实现参数转列的方向,现在只需要先把每组时间统一为ME_POW_1对应时间的问题解决掉就行。咱们一步步来:
步骤1:理解分组逻辑
从你的输入示例能看出来,每一组数据包含FAN_RFB、KW_TOTAL、ME_POW_1、ME_POW_2这几个参数(你说实际是24个,逻辑完全一致),每组的锚点是ME_POW_1——我们需要以它的出现来划分不同的组,然后把同组所有行的时间替换成它的时间。
步骤2:完整代码实现
我把你的原有代码修改并补充,直接就能得到你要的结果:
import pandas as pd # 读取原始数据(保留你原来的读取逻辑) raw = pd.read_csv('example.csv', usecols=[0,1,2,3]) # 1. 生成分组标识:每遇到一个ME_POW_1就开启新的一组 raw['group_id'] = (raw['Name'] == 'ME_POW_1').cumsum() # 2. 合并Date和Time为完整的datetime列 raw['datetime'] = pd.to_datetime(raw['Date'] + ' ' + raw['Time']) # 3. 修正时间:将每组所有行的时间替换为该组ME_POW_1对应的datetime raw['corrected_datetime'] = raw.groupby('group_id')['datetime'].transform( lambda group: group[raw.loc[group.index, 'Name'] == 'ME_POW_1'].iloc[0] ) # 4. 执行透视,把Name列的参数转为独立列 result = raw.pivot(index='corrected_datetime', columns='Name', values='Value').reset_index() # 5. 拆分修正后的时间为Date和Time列,匹配你期望的输出格式 result[['Date', 'Time']] = result['corrected_datetime'].astype(str).str.split(' ', expand=True) result = result.drop('corrected_datetime', axis=1) # 调整列的顺序,和你要的输出一致(如果实际有24个参数,把所有参数列按顺序列出来即可) result = result[['Date', 'Time', 'FAN_RFB', 'KW_TOTAL', 'ME_POW_1', 'ME_POW_2']] # 查看结果 print(result)
关键逻辑解释
- 分组标识
group_id:用(raw['Name'] == 'ME_POW_1').cumsum(),每遇到一行ME_POW_1,累加器就+1,这样自动把每组数据分到同一个group_id下。 - 时间修正的
transform方法:groupby.transform会对每个组执行自定义逻辑,我们在每个组里找到Name为ME_POW_1的那一行的时间,然后把整个组的corrected_datetime都设为这个值——这样就实现了同组时间统一。 - 透视后的格式调整:拆分
corrected_datetime为Date和Time列,并调整列顺序,完美匹配你期望的输出。
用你的输入示例运行这段代码,就能得到和你给出的期望输出完全一致的结果啦!
内容的提问来源于stack exchange,提问作者Arun Krishnan
相关产品推荐
相关产品推荐

