如何在同一DataFrame中添加含新表头的传感器数据分段
保留传感器列组的独立输出方案
你的需求是:当每日请求返回的传感器列集合变化时,避免将所有列合并到同一个DataFrame(出现大量空值),而是按列组分开输出,每组对应独立的表头和数据。
修改后的代码
import datetime import requests import json import pandas as pd import numpy as np from datetime import timedelta start_date = datetime.datetime(2023,1,1,0,0) end_date = datetime.datetime(2023,1,6,0,0) # 用列表存储不同列组的数据块 data_blocks = [] current_date = start_date while current_date < end_date: q = 'url' # 替换为实际请求URL r = requests.get(q) j = json.loads(r.text) if 'result' in j: dt_series = pd.to_datetime(np.array(j['result']['data'])[:,0]) sensors = np.array(j['result']['sensors']) data = np.array(j['result']['data'])[:,1:] df_new = pd.DataFrame(data, index=dt_series, columns=sensors) # 判断是否需要新建数据块 if not data_blocks: # 第一个块直接加入 data_blocks.append(df_new) else: last_block = data_blocks[-1] # 对比当前列和最后一个块的列是否完全一致 if not df_new.columns.equals(last_block.columns): data_blocks.append(df_new) else: # 列一致则追加到最后一个块 data_blocks[-1] = pd.concat([last_block, df_new]) current_date += timedelta(days=1) # 按要求格式输出每个数据块 for block in data_blocks: # 重置索引,把datetime作为列输出 output_df = block.reset_index().rename(columns={'index': 'datetime'}) # 打印表头和数据,用分号分隔 print(';'.join(output_df.columns) + ';') for _, row in output_df.iterrows(): row_str = ';'.join(str(val) if pd.notna(val) else '' for val in row) print(row_str + ';')
核心改动说明
- 用
data_blocks列表替代单一的sensor_data,专门存储不同列组的DataFrame:当返回的传感器列集合变化时,自动新增一个数据块;列集合不变时,就把数据追加到当前块 - 输出阶段逐个处理每个数据块,将索引转为
datetime列,再按分号分隔的格式打印表头和每行数据,完全匹配你期望的输出样式
内容的提问来源于stack exchange,提问作者user16511234
相关产品推荐
相关产品推荐

