Pandas中如何高效.get多时间序列创建DataFrame避免重复代码?
多时间序列重采样合并的DRY实现方案
你当前逐一定义变量、逐一重采样再拼接的写法,在序列数量增多时会产生大量重复代码,维护时很容易出现参数修改不一致的问题,可通过抽离公共配置+循环批量处理的方式优化。
基础实现(新手友好)
核心思路是把所有固定参数、需要处理的序列标识统一抽离,用列表推导式一次性完成「拉取数据-重采样聚合」的重复操作,最后一次性拼接为DataFrame:
import pandas as pd # 公共参数统一维护,后续修改仅需调整此处 START_TS = '2022-01-01 12:00:00' END_TS = '2022-01-01 18:00:00' RESAMPLE_SETTING = {'rule': '1H', 'label': 'right'} # 所有需要拉取的测点ID放到列表中,新增/删除序列仅需修改该列表 TAG_LIST = ['tag1', 'tag2'] # 替换为你实际的tagid,注意原示例中两个get的tagid重复,需要区分 # 批量完成拉取+重采样,同时给每个序列设置对应tagid为列名 processed_series = [ client.get(tag, start=START_TS, end=END_TS) .resample(**RESAMPLE_SETTING) .mean() .rename(tag) for tag in TAG_LIST ] # 拼接为多列DataFrame df = pd.concat(processed_series, join='outer', axis=1, sort=False)
方案优势
- 无重复代码,所有公共配置仅需定义一次,不会出现修改时间范围、重采样规则时漏改某一行的问题
- 扩展性强,后续新增时间序列仅需在
TAG_LIST中追加对应id即可,不需要复制粘贴整段逻辑 - 合并后的DataFrame默认以tagid作为列名,无需额外重命名即可直接区分每列对应的序列
灵活扩展提示
如果存在不同序列需要使用不同聚合规则的场景,可以把配置改为字典结构映射tagid和聚合方法,例如:
# 键为tagid,值为对应的聚合方法 TAG_AGG_MAP = { 'tag1': 'mean', 'tag2': 'max', 'tag3': 'sum' } processed_series = [ client.get(tag, start=START_TS, end=END_TS) .resample(**RESAMPLE_SETTING) .agg(agg_method) .rename(tag) for tag, agg_method in TAG_AGG_MAP.items() ]
内容的提问来源于stack exchange,提问作者trsen
相关产品推荐
相关产品推荐

