如何给DataFrame的DateTime索引每行加随机微秒解决重复索引问题
解决方案
核心问题原因
你之前的写法只调用了1次random.randrange生成单个随机整数,因此所有行都会叠加同一个微秒值,不会出现逐行差异。
问题2解答:可直接操作索引,无需修改TimeUTC列
直接生成和DataFrame行数一致的随机微秒序列,叠加到原有DatetimeIndex上即可:
import datetime import random import pandas as pd # 方法1:标准库实现,适合中小数据量 random_micros = [datetime.timedelta(microseconds=random.randint(0, 999999)) for _ in range(len(df))] df.index = df.index + random_micros # 方法2:numpy实现,适合10万行以上的大数据量,效率更高 import numpy as np random_micros = np.random.randint(0, 1000000, size=len(df)) df.index = df.index + pd.to_timedelta(random_micros, unit='us')
问题1解答:给每行TimeUTC字段添加不同随机微秒
逻辑和直接操作索引一致,把叠加对象换成TimeUTC列即可:
# 中小数据量实现 df['TimeUTC'] = df['TimeUTC'] + [datetime.timedelta(microseconds=random.randint(0, 999999)) for _ in range(len(df))] # 操作完成后可按需重新设置索引 df = df.set_index('TimeUTC', drop=True)
优化方案(彻底避免索引重复)
如果同一原始秒级时间戳下的行数较多,随机微秒可能出现碰撞导致索引仍重复,可按原始索引分组后给同组内的行分配不重复的微秒,确保索引全局唯一:
df.index = df.index.groupby(df.index).transform( lambda group: group + pd.to_timedelta(random.sample(range(1000000), k=len(group)), unit='us') )
内容的提问来源于stack exchange,提问作者DKovar
相关产品推荐
相关产品推荐

