时间序列数据补全异常:循环插入的虚拟数据时间值全部相同
时间序列补全时重复引用导致time字段值一致的问题解决
你遇到的这个问题其实是Python里字典引用传递的坑!咱们来拆解一下:
问题根源
你在循环里用了fd.append(fd[length_dict-1]),这其实是把最后一条记录的字典引用加到列表里了,而不是创建一个新的字典副本。所以后面不管你修改哪一个新增元素的time字段,其实都是在修改同一个字典对象,最后所有新增记录自然都显示成最后一次修改的时间了。
修复方案
解决办法很简单:每次新增的时候,创建原字典的浅拷贝(如果字典里没有嵌套结构,浅拷贝就足够),这样每个新增的都是独立的字典对象。
修正后的代码
from datetime import datetime, timedelta # 假设fd是已有的字典列表,示例数据 fd = [{'a': 636, 'b': 'D1016', 'c': 53.280004, 'd': 0.0, 'e': 28.765, 'time': '2017-12-10 14:54:07'} for _ in range(53)] length_dict = len(fd) if length_dict <= 60: row_to_insert = 60 - length_dict last_time = fd[length_dict-1]['time'] # 先把最后一条记录转成datetime对象,避免每次循环重复解析 base_date = datetime.strptime(last_time, '%Y-%m-%d %H:%M:%S') for row in range(row_to_insert): # 创建原字典的浅拷贝,而不是直接引用 new_row = fd[length_dict-1].copy() fd.append(new_row) # 计算当前要新增的时间:base_date加上(row+1)分钟 modified_date = base_date + timedelta(minutes=(row+1)) modified_date_str = modified_date.strftime("%Y/%m/%d %H:%M:%S") # 修改当前新增的字典的time字段 new_row['time'] = modified_date_str # 可以验证一下 print(f"lngth of fd: {len(fd)} {modified_date_str}")
关键修改点
- 用
fd[length_dict-1].copy()替代直接append原字典,创建独立的新字典 - 把
datetime.strptime提到循环外面,避免重复解析字符串,提升效率 - 直接修改刚创建的
new_row字典,逻辑更清晰
这样修改后,你新增的每条记录的time字段就会是依次递增的分钟数,不会全部变成最后一个值了。
内容的提问来源于stack exchange,提问作者Naitik Shukla
相关产品推荐
相关产品推荐

